mfc下多線程編程
1.mfc支持兩種線程
用戶界面線程
工作線程
2.mfc中所有線程都是由CWinThread對象表示
CWinThread是用戶接口線程的基類, CWinApp就是從CWinThread派生出來的
在寫用戶接口線程時, 也要從CWinThread類派生出自己的線程類
可以調用AfxBeginThread函數, 會創建CWinThread對象
3.編寫是想工作線程的控制函數, 控制函數的原型:
UINT ControlFunctionName(LPVOID pParam); //線程回調
4.線程調用AfxBeginThread函數就可以創建新的線程
5.創建并啟動工作線程:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
WORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
6.AfxEndThread終止線程
7.創建用戶界面線程
從CWinThread類派生出自己的線程類
改造這個類
啟動用戶界面
8.基類的一些成員函數:
ExitInstance, 當線程退出是, 會調用執行清理工作
InitInstance, 執行線程類實例初始化, 子類必須重寫
OnIdle, 執行線程特定空閑時間處理
PreTranslateMessage, 過濾消息
Run, 執行線程函數
9.AfxBeginThread函數的另一個重載原型:(界面線程)
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass, //用RUNTIME_CLASS宏將線程類指針轉換為指向CRuntimeClass對象指針
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0;
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
10.終止線程
正常終止線程 VOID PostQuitMessage(int nExitCode);
提前終止線程 在線程內調用AfxEndThread函數 VOID AfxEndThread(UINT nExitCode);
11.線程同步技術
信號量 --限制使用共享資源的線程數目
CSemaphore g_Sem(5, 5); 時間內最多只有5個線程能共享資源, 還初始開始時沒有線程獲得信號資源
一旦線程訪問共享資源, 信號量計數器就減1, 若變為0, 則下來對資源的訪問就會被拒絕, 知道持有的資源線程釋放了資源的持有權
互斥對象 --內核對象
臨界區 --用戶模式對象 弄不好就容易出現死鎖, 不過用起來很簡單, 只有4個API
InitializeCriticalSection, EterCreiticalSection, LeveCriticalSection, DeleteCriticalSection
事件對象 --內核對象 分收工重置對象和自動重置對象