2013-12-09 31 views
0

我正在用C++和OpenCV編寫一些程序。類C++的線程程序

我想實現的是製作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(); 
}; 
} 

類似的東西。然後,我想在我的主應用程序中執行此操作:主函數:

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個線程,但通常我會使用更多。問題是,爲了編譯代碼,線程過程必須是靜態的,但是當過程是靜態的,我不能在它內部使用非靜態對象和函數..這導致了我的大問題。

任何想法的如何解決這個問題? (我不能讓所有事情都是靜態的......它必須保持原樣)。

+0

你能不能把你所有的pbas,cv等放到一個類中,並將它的一個實例作爲'void * Args'來傳遞?既可以創建全局範圍的數組,也可以創建新的數組。 –

回答

2

添加非靜態方法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); 
據我所知,0

+0

這就是我需要的!解決了。非常感謝! – patrykos91

+0

'pbasResult'是不可變的? –

+0

另外,是單pbas實例線程安全嗎? –