mfc多線程的實現(xiàn)方式 handle函數(shù)?
handle函數(shù)?HANDLE:Windows使用HANDLE來表示一個對象(不是C中的對象)。HWND是其中之一,HWND是一個句柄,但是句柄不僅僅是HWND。HandlMFC中的多線程如何實現(xiàn)。和
handle函數(shù)?
HANDLE:Windows使用HANDLE來表示一個對象(不是C中的對象)。HWND是其中之一,HWND是一個句柄,但是句柄不僅僅是HWND。Handl
MFC中的多線程如何實現(xiàn)。和單線程有啥區(qū)別?
Windows調(diào)度線程,多線程可以實現(xiàn)程序的實時多任務(wù),但也增加了程序的復(fù)雜度,即需要線程同步。
要實現(xiàn)一個線程,只需要AfxB
MFC中,我啟用線程后,在線程函數(shù)中如何獲取當(dāng)前光標(biāo)所在位置?
這個指針存儲在主線程的堆棧中,傳遞給子線程的指針實際上是訪問子線程的堆棧。當(dāng)然,不可能得到正確的值。其實直接傳光標(biāo)坐標(biāo)就可以了。在子線程中處理接口會導(dǎo)致頻繁的線程切換,影響效率。
子線程可以直接調(diào)用主線程方法嗎?
啟動線程時有一個參數(shù)LPVOID,通過這個參數(shù)可以傳入主線程中的對象指針,子線程可以用這個指針調(diào)用它的成員函數(shù)。但需要注意的是,不要用子線程中的指針直接調(diào)用主線程中窗口對象的成員函數(shù)。這將導(dǎo)致一些潛在的錯誤。因為MFC不是線程安全的。
線程間通信有哪些方式?
多線程通信有三種主要方法:
1.全局變量
進程中線程間的內(nèi)存共享是一種常見的通信和交互。
注意:定義全局變量時最好使用volatile,以防編譯器優(yōu)化這個變量。
消息機制
消息通信有兩個常見的接口:PostMessage和PostThreadMessage。
PostMessage向線程的主窗口發(fā)送一條消息。PostThreadMessage是任意兩個線程之間的通信接口。
()
功能原型:
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM LPARAM);
參數(shù):
窗口程序接收消息的窗口的句柄??梢匀蓚€具有特定含義的值:
:消息被發(fā)送到系統(tǒng)的所有頂層窗口,包括不屬于自己的無效或不可見的窗口和被覆蓋的窗口。
和彈出窗口。消息不會發(fā)送到子窗口。
NULL:該函數(shù)的操作與調(diào)用PostThreadMessage函數(shù)相同,將參數(shù)dwThread設(shè)置為當(dāng)前線程的標(biāo)識符。
Msg:指定要發(fā)送的消息。
WParam:指定特定于消息的附加信息。
IParam:指定附加的特定于消息的信息。
返回值:如果函數(shù)調(diào)用成功,返回非零值;如果函數(shù)調(diào)用失敗,返回值為零。
MS還提供了用于消息間通信的SendMessage方法SendMessage(),它不同于PostMessage:
SendMessage是同步的,而PostMessage是異步的。SendMessage在返回之前必須等待發(fā)送的消息被執(zhí)行。
()
PostThreadMessage方法可以向指定的線程發(fā)送消息。
函數(shù)原型:Bool post Thread message(dword ID Thread,uintmsg,wparam wparam,lparam lparam)
參數(shù)除了ThreadId基本和PostMessage一樣。
目標(biāo)線程通過GetMessage()方法接受消息。
注意:使用這個方法時,目標(biāo)線程必須已經(jīng)有了自己的消息隊列。否則,將返回ERROR_INVALID_THREAD_ID錯誤??梢允褂?/p>
PeekMessage()為線程創(chuàng)建一個消息隊列。
3.CEvent
目標(biāo)
CEvent是MFC中的一個對象,通過改變CEvent的觸發(fā)狀態(tài)可以實現(xiàn)線程間的通信和同步。