2011-11-07 177 views
4

我已經調用了使用輔助線程的方法。 從方法內部我需要從主線程調用一個方法。從輔助線程使用主線程的調用方法

這裏是結構

void main_thread_method() 
{ 

} 

void secondary_thread_method() 
{ 

//do something here 

    call main_thread_method() here using main thread 

} 

pthread thread1; 

pthread_create (&thread1, NULL, (void *) &secondary_thread_method, NULL); 

pthread_join(thread1); 
+0

由於一個線程中的數據可以從同一進程中的另一個線程訪問,所以我沒有看到問題所在?你想將控制轉移到另一個線程進行一些計算嗎?在這種情況下,檢查信號和條件變量。 –

+0

@All:在Objective C/C++中,有一個API可以在輔助線程中使用主線程調用方法。實際上,我需要調用gtkWindow對象,該對象只能從主線程調用。 – boom

回答

4

如果你的主線程運行一個消息泵,你可以發佈一條消息不知何故執行功能收到您的郵件時。

否則有一個簡單的隊列(當然適當的鎖定)。將足夠的數據添加到隊列中,以便可以調用main_thread_method。 (參數等)。定期輪詢簡單隊列以查找主線程中的新消息並處理它們。

+0

+1有比輪詢更好的方法,但基本上這是正確的技術。基本上,主線不能坐在旁邊等待加入,它必須積極傾聽。 –

+0

用於PostMessage到主線程窗口的+1。我通常使用一個在啓動時使用RegisterClass()和CreateWindow()爲主線程發佈的所有帖子創建的不可見窗口。我將wParam中的目標窗口實例和lParam中的參數進行傳輸。然後WndProc調用一個消息處理程序,當它獲得張貼的消息時傳遞給它的任何窗口。 'lParam'參數可以是任何東西,通常我傳遞一個包含'command'枚舉的類(以及其他東西,例如數據緩衝區),通過交換機可以調用主線程上的任意數量的方法更新控件等 –

+0

@Martin我認爲op正在尋找linux解決方案 –

1

我知道你想從輔助線程調用一個必須在主線程中運行的方法。這不可能。調用的函數在同一個線程中運行。您可以使用任何種類的多線程通信方法,如信號量,消息池,條件等。

相關問題