类中的 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)