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
    事件對象 --內核對象 分收工重置對象和自動重置對象