2015-06-10 24 views
1

我正在閱讀其他人的代碼,他們的代碼正在工作。我只是覺得PostMessage的有點混淆視聽,他們用postmessage和消息循環在不同的線程

#define MESSAGE XXX //some number 
BEGIN_MESSAGE_MAP(myClass, CDialog) 
//... 
ON_THREAD_MESSAGE(...) 
END_MESSAGE_MAP() 
... myClass::funcA(...) 
{ 
    static HANDLE t = createThread(...., funcB,....) 
    ..... 
    postmessage(MESSAGE) 

} 

... myClass::funcB(...) 
{ 
    .... 
    while(...) 
    { 
     TranslateMessage(&msg); 
     dispatchMessage(&msg); 
    } 

} 

代碼看起來這樣的,但有一點修改

根據MSDN 時PostMessage的的_In_opt_ HWND hWnd爲設置爲null

消息循環

該函數的行爲與對PostThreadMessage的調用類似,dwThreadId參數設置爲當前線程的標識符。

這讓我感到困惑。看來主線程創建的t線程實際上接收到了msg?任何人都可以解釋嗎?

順便說一句,我是新來的MFC,這是我的第一篇文章在這裏,如果我誤解了什麼,讓我知道

+0

您是否發佈了createThread和postmessage的錯誤大小寫?這些不是MFC或API函數,如果它們在顯示時大寫。 –

+0

@ ScottMcP-MVP哦,是的,我做了一些錯字。他們應該是PostMessage和CreateThread – HLi

回答

0

你似乎被調用的CWnd :: PostMessage的功能,而不是API PostMessage函數。因此,該呼叫使用其HWND成員向myClass對話框發送消息,並且該消息將在進行呼叫的同一線程中接收。

+0

所以你的意思是運行funcB的線程將不會收到該消息? – HLi

+0

正確。操作系統將消息發佈到創建HWND的線程。 –