2011-03-23 46 views
2

我重寫了很久以前寫過的一些代碼。 該代碼是一個啓動另一個工作線程的類AfxBeginThread。當線程結束時,它需要將其返回給調用類。在另一個線程上調用非靜態類函數

實際上,當線程結束時,它發送一條消息PostMessage,其結果給被調用類。 但是這種方式真的是依賴於MFC,爲此我的類必須實現所有MFC的東西。

如果不是發送消息,而是直接調用此類的非靜態方法,可能會正確嗎?

回答

3

與其嘗試直接調用方法(這將引入一組全新的線程問題),請嘗試使用本機Win32 ::PostMessage()而不是MFC實現相同的函數。任何線程都可以調用::PostMessage()來安全地將消息傳遞給另一個線程。

+0

我該如何收回這條信息?我的類不是MFC派生的。 – bratao 2011-03-23 03:51:27

+0

@bratao:使用Windows程序的正常消息循環(我認爲)。 – Xeo 2011-03-23 04:03:02

+0

你說你正在用'AfxBeginThread'啓動線程,這是一個MFC函數。無論如何,Xeo是正確的,它只是一個常規的消息,進入你的消息循環,但是你處理這個(MFC或不)。 – 2011-03-23 04:14:50

0

聽起來好像您要使用常規線程化基元,而不是窗口消息基元。

您使用的是哪個版本的AfxBeginThread?如果您將它傳遞給一個類實例,那麼一旦知道它已完成運行,您應該能夠直接訪問該類的成員。如果你傳遞了一個函數指針,你可以用lParam參數傳入任何類指針,然後用它作爲通信上下文。

你只是想確保當你訪問這個類時,你可以以線程安全的方式進行操作。如果你等到線程結束,你應該沒問題。否則,您可以使用臨界區或互斥區。有關更多信息,請參閱MSDN article on thread synchronization primitives

+0

進入這個類後,它會做很多事情,包括繪畫和繪畫。如果我在另一個線程中調用類函數,它將不會返回到主線程,但會保持2個線程處理事務,這非常危險。我選擇將我的課程轉換爲基於CWnd的課程,這樣就可以訪問消息映射,真正簡化了我的代碼; – bratao 2011-03-23 15:03:33