轉帖+部分原創
1、工作者線程傾向於瑣碎的處理,與它不同的是,使用介面執行緒具有自己的介面而且實際上類似於運行其他應用程式。建立線程而不是其他應用程式的好處是線程可與應用程式共用程式空間,這樣可以簡化線程與應用程式共用資料的功能。
2、典型情況是使用介面執行緒用於完成查詢和替換等功能,或者是其他不希望佔用主應用程式大量處理時間但是需要一個介面的功能或服務,或者使用者也可完全不考慮介面,將這種類型的線程用於視窗Message Service器作為一種傳遞其訊息的方式,以避免使自己因佔用處理時間過多而陷入困境。
3、在時間要求嚴格的應用程式(例如即時應用程式)中,不希望因為工作者線程啟動而等待,這時可將工作者線程中的控制邏輯內建到使用介面執行緒中並提前建立線程。當需要處理事務時,向使用介面執行緒發送訊息,此時使用介面執行緒已經運行並且在等待指令。
2種線程都可以用AfxBeginThread建立,注意不同的是第一個參數。
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//WORK線程
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//UI線程
下面是2種線程的建立步驟:
工作者線程:
首先建立一個函數UNIT ThreadProc(LPVOID pParam);可以把這個函數看成一個線程,進行需要的操作。
然後在需要調用的時候(比如initialize的時候)調用AfxBeginThread(ThreadProc,//ThreadProc控制函數地址
&m_Control,//要顯示的地區,控制項對象地址,比如EDITBOX LISTBOX
0,0,0,NULL)
啟動線程即可
使用者介面進程:
這裡以建立好的對話方塊MFC程式為例,首先使用者介面進程需要從CWinThread類派生一個新的線程類,就叫它CMultipleThread吧,這個類下需要有表單成員CMultipleThreadDlg* m_pDlg用於在表單上顯示,要不然怎麼叫介面進程呢?還需要重載虛函數virtual int Run(),在Run函數裡進行需要的操作。
接著就可以在程式建立該線程
CMultipleThread* pThread = (CMultipleThread*)AfxBeginThread(RUNTIME_CLASS(CMultipleThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL),
pThread->SetOwner(this)//設定視窗指標
pThread->ResumeThread();//恢複線程