【问题标题】:C++ thread procedure from class类中的 C++ 线程过程
【发布时间】: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”传递?要么创建一个全局范围的数组,要么新建它们。

标签: c++ multithreading opencv


【解决方案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 你是对的。我的回答中没有关于线程安全的内容。但这是下一步,只有问题的作者才能真正知道在那里使用一些同步代码的必要性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多