类中的 C++ 线程过程

Posted

技术标签:

【中文标题】类中的 C++ 线程过程【英文标题】:C++ thread procedure from class 【发布时间】:2013-12-09 17:08:55 【问题描述】:

我正在使用 C++ 和 OpenCV 编写一些程序。

我想要实现的是创建 2 个线程并将我的类中的 2 个函数传递给它们以加快计算速度。

我不擅长解释,所以我只会告诉你问题出在哪里!

这是我的课:

class mainApp
  
private:
cv::Mat frame;
int frameNumber;

HANDLE pbasThread;
HANDLE skinsegThread;
std::vector < HANDLE > threads;

PBAS pbas; 
cv::Mat pbasResult; 

SKINSEG skinseg;
cv::Mat skinsegResult;

private:
void find_connected_components(cv::Mat *mask, int poly1_hull0 = 1, float perimScale  = 4.0, int* num = NULL, CvRect* bbs = NULL, CvPoint* centers = NULL); 

static void __cdecl pbasThreadProc( void * Args )

    cv::Mat bluredImage;
    cv::GaussianBlur(frame, bluredImage, cv::Size(5,5), 1.5);
    pbas.process(&bluredImage, &pbasResult);
    cv::medianBlur(pbasResult, pbasResult, 5);
    _endthread();
;

类似的东西。然后我想在我的 mainApp:main 函数中执行此操作:

while(1)

HANDLE pbasThread =( HANDLE ) _beginthread( pbasThreadProc, 0, (void *)this );

        threads.push_back(pbasThread);

        if( threads.size() > 0 )
        WaitForMultipleObjects( threads.size(), & threads[ 0 ], TRUE, INFINITE );
...


在这个例子中,我只使用了 1 个线程,但通常我会使用更多。问题是线程过程必须是静态的才能编译代码,但是当过程是静态的时,我不能在其中使用非静态对象和函数..这导致了我的大问题。

知道如何解决这个问题吗? (我不能让一切都是静态的。它必须保持原样)。

【问题讨论】:

你能不能把你所有的 pbas、cv 等都放到一个类中,并将它的一个实例作为“void * Args”传递?要么创建一个全局范围的数组,要么新建它们。 【参考方案1】:

将非静态方法ExecuteInThread 添加到您的类mainApp

void mainApp::ExecuteInThread()

    cv::Mat bluredImage;
    cv::GaussianBlur(frame, bluredImage, cv::Size(5,5), 1.5);
    pbas.process(&bluredImage, &pbasResult);
    cv::medianBlur(pbasResult, pbasResult, 5);

并在你的线程函数中调用它:

static void __cdecl pbasThreadProc( void * Args )

    mainApp* app = static_cast<mainApp*>(Args);

    app->ExecuteInThread();
    _endthread();
;

您还应该将指向mainApp 类对象的指针传递给pbasThreadProc 函数,但您已经在字符串中这样做了

HANDLE pbasThread =( HANDLE ) _beginthread( pbasThreadProc, 0, (void *)this );

据我了解。

【讨论】:

这就是我所需要的!解决了。非常感谢! 'pbasResult' 是不可变的? @Martin James 你是对的。我的回答中没有关于线程安全的内容。但这是下一步,只有问题的作者才能真正知道在那里使用一些同步代码的必要性。

以上是关于类中的 C++ 线程过程的主要内容,如果未能解决你的问题,请参考以下文章

如何将类中的函数放入线程中? (使用 Boost 的 C++)

如何在一个类中执行 C++ 多线程(将线程引用保持为成员 var)

c++中如何将子线程的参数传回主线程

从 WTL 和 C++ 中的工作线程更新 CListViewCtrl

如何在 C++ 14 的类中启动线程?

在 C++ 中提升线程