WIN32 API下多線程編程
1.線程創建:該函數在其調用進程的進程空間裏創建一個新的線程,並返回已建線程的句柄。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
其中各參數說明如下:
llpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置爲 NULL;
ldwStackSize:指定了線程的堆棧深度,一般都設置爲0,表示線程堆棧大小與創建它的線程相同;
llpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況爲(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數名,函數原型如下:
DWORD WINAPI threadfunc(LPVOID param);
llpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
ldwCreationFlags:控制線程創建的附加標誌,可以取兩種值。如果該參數爲0,線程在被創建後就會立即開始執行;如果該參數爲CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;
llpThreadId:該參數返回所創建線程的ID;
{
cout << "test" << endl;
MessageBox(NULL, "test", "title", MB_OK);
return 0;
}
int main()
{
HANDLE p;
DWORD a = 10;
DWORD id = 0;
p = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func1, &a, 0, &id);
//WaitForSingleObject(p, INFINITE);
return 0;
}
2.線程懸掛和恢復:創建新的線程後,該線程就開始啓動執行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,線程並不馬上執行,而是先掛起,等到調用ResumeThread後纔開始啓動線程。
//該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。
DWORD ResumeThread(HANDLE hThread);
//該函數用於結束線程的掛起狀態,執行線程。
3.線程優先級操作:
//調用該函數得到線程優先權。
BOOL SetThreadPriority(HANDLE hThread,int nPriority);
//調用該函數來設置線程的優先權。
4.線程退出:當調用線程的函數返回後,線程自動終止。
VOID ExitThread(DWORD dwExitCode);
//如果在線程的外面終止線程,則可調用下面的函數:
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
注意:
(1)TerminateThread函數可能會引起系統不穩定,而且線程所佔用的資源也不釋放。因此,一般情況下,建議不要使用該函數。
(2)如果要終止的線程是進程內的最後一個線程,則線程被終止後相應的進程也應終止。
(3)釋放資源後,將線程HANDLE置成NULL。
(4)使用TerminateThread後,需調用CloseHandle( )函數釋放線程所佔用的堆棧。
MFC下多線程編程之工作線程編程
1.線程創建:
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
各參數如下:
l參數pfnThreadProc是線程執行體函數,函數原形爲: UINT ThreadFunction( LPVOID pParam)。
l參數pParam是傳遞給執行函數的參數;
l參數nPriority是線程執行權限,可選值:
THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_LOWEST、THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_IDLE。
l參數dwCreateFlags是線程創建時的標誌,可取值CREATE_SUSPENDED,表示線程創建後處於掛起狀態,調用ResumeThread函數後線程繼續運行,或者取值“0”表示線程創建後處於運行狀態。
l返回值是CWinThread類對象指針,它的成員變量m_hThread爲線程句柄,在Win32 API方式下對線程操作的函數參數都要求提供線程的句柄,所以當線程創建後可以使用所有Win32 API函數對pWinThread->m_Thread線程進行相關操作。
注意:如果在一個類對象中創建和啓動線程時,應將線程函數定義成類外的全局函數(或者類中的靜態函數似乎也可以)。
2.線程懸掛和恢復 / 優先級操作:同上。
3.線程退出:當調用線程的函數返回後,線程自動終止。
void AfxEndThread(UINT nExitCode, BOOL bDelete = TRUE);
//可以在線程的外部調用來強行終止一個線程的運行。
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );
注意:
(1)使用TerminateThread後,需調用CloseHandle( )函數釋放線程所佔用的堆棧。
(2)釋放資源後,將線程HANDLE置成NULL。
進程間通信
1.全局變量方式:
(1)進程和線程共享全局變量,可利用該全局變量達到通信的目的。
(2)將進程的HADNLE作爲參數傳遞給線程函數,然後線程可根據此HANDLE對進程的變量進行操作。
2.消息通信方式:
BOOL PostThreadMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam =0 );
返回值如果公佈了消息,則返回非零值;否則返回0。
參數message指定了要公佈的消息。
wParam指定了附加的消息信息。這個參數的內容依賴於要公佈的消息。
lParam指定了附加的消息信息。這個參數的內容依賴於要公佈的消息。
說明:這個函數將一個消息放入窗口的消息隊列,然後直接返回,並不等待對應的窗口處理消息。消息隊列中的消息是通過調用Windows的GetMessage或PeekMessage函數來獲得的。可以通過Windows的PostMessage函數來訪問其它應用程序。
BOOL PostThreadMessage( UINT message , WPARAM wParam, LPARAMlParam );返回值如果成功,則返回非零值;否則返回0。
參數message用戶自定義消息的ID。
wParam第一個消息參數。
lParam第二個消息參數。
說明:調用這個函數以向其它CWinThread對象發送一個用戶自定義消息。發送的消息通過消息映射宏ON_THREAD_MESSAGE被映射到適當的消息處理函數。