1.線程建立
該函數在其調用進程的進程空間裡建立一個新的線程,並返回已建線程的控制代碼。
HANDLE CreateThread(LPSECURITY_ATTRIBUTES
lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE
lpStartAddress, LPVOID lpParameter, DWORD
dwCreationFlags, LPDWORD lpThreadId);
其中各參數說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指標,該結構決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設定為0,表示線程堆棧大小與建立它的線程相同;
lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。
一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數名,函數原型如下:
DWORD WINAPI threadfunc(LPVOID param);
lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
dwCreationFlags:控制線程建立的附加標誌,可以取兩種值:如果該參數為0,線程在被建立後就會立即開始執行;如果該參數為CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;
lpThreadId:該參數返回所建立線程的ID;
2.線程懸掛和恢複
建立新的線程後,該線程就開始啟動執行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,線程並不馬上執行,而是先掛起,等到調用ResumeThread後才開始啟動線程。
DWORD SuspendThread(HANDLE hThread);
//該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。
DWORD ResumeThread(HANDLE hThread);
//該函數用於結束線程的掛起狀態,執行線程。
3.線程優先順序操作
int GetThreadPriority(HANDLE hThread);
//調用該函數得到線程優先權。
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( )函數釋放線程所佔用的堆棧。
處理序間通訊
1.全域變數方式:
(1)進程和線程共用全域變數,可利用該全域變數達到通訊的目的。
(2)將進程的HADNLE作為參數傳遞給線程函數,然後線程可根據此HANDLE對進程的變數進行操作。
2.訊息通訊方式:
BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL PostThreadMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
顯然它們發送到的對象不同:PostMessage發訊息給視窗,PostThreadMessage發訊息給線程。且當PostThreadMessage的hWnd = NULL時,表明該訊息傳遞給當前線程本身。
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被映射到適當的訊息處理函數。
3.同步方式:具體參見http://www.cppblog.com/andxie99/archive/2006/10/10/13517.html。