C++;类中的线程过程 使用C++和OpenCV.编写程序

C++;类中的线程过程 使用C++和OpenCV.编写程序,c++,multithreading,opencv,C++,Multithreading,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 ski

我想要实现的是生成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();
};
}
在本例中,我只使用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);
}
并在线程函数中调用它:

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 );
...

}
static void __cdecl pbasThreadProc( void * Args )
{
    mainApp* app = static_cast<mainApp*>(Args);

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

据我所知。

您能否将所有PBA、cv等放在一个类中,并将其实例作为“void*Args”传递?要么创建一个全局范围的数组,要么创建新的数组。这就是我需要的!解决了的。非常感谢pbasResult“是不可变的吗?@Martin James你说得对。我的回答中没有关于线程安全的内容。但这是下一步,只有问题的作者才能真正了解在那里使用同步代码的必要性。
HANDLE pbasThread =( HANDLE ) _beginthread( pbasThreadProc, 0, (void *)this );