Windows下多線程常用函數

來源:互聯網
上載者:User

 

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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.