創建線程的API函數
一、Windows系統為我們提供的APIHANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:線程安全相關的屬性,常置為NULL SIZE_T dwStackSize,//initialstacksize:新線程的初始化棧的大小,可設置為0 LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction:被線程執行的回調函數,也稱為線程函數 LPVOID lpParameter,//threadargument:傳入線程函數的參數,不需傳遞參數時為NULL DWord dwCreationFlags,//creationoption:控制線程創建的標志 LPDWORD lpThreadId//threadidentifier:傳出參數,用于獲得線程ID,如果為NULL則不返回線程ID )/*lpThreadAttributes:指向SECURITY_ATTRIBUTES結構的指針,決定返回的句柄是否可被子進程繼承,如果為NULL則表示返回的句柄不能被子進程繼承。dwStackSize:設置初始棧的大小,以字節為單位,如果為0,那么默認將使用與調用該函數的線程相同的棧空間大小。任何情況下,Windows根據需要動態延長堆棧的大小。lpStartAddress:指向線程函數的指針,函數名稱沒有限制,但是必須以下列形式聲明:DWORD WINAPI 函數名 (LPVOID lpParam) ,格式不正確將無法調用成功。lpParameter:向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULL。dwCreationFlags:控制線程創建的標志,可取值如下:(1)CREATE_SUSPENDED(0x00000004):創建一個掛起的線程(就緒狀態),直到線程被喚醒時才調用(2)0:表示創建后立即激活。(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數指定初始的保留堆棧的大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION標志未指定,dwStackSize將會設為系統預留的值lpThreadId:保存新線程的id返回值:函數成功,返回線程句柄,否則返回NULL。如果線程創建失敗,可通過GetLastError函數獲得錯誤信息。*/BOOL WINAPI CloseHandle(HANDLE hObject); //關閉一個被打開的對象句柄/*可用這個函數關閉創建的線程句柄,如果函數執行成功則返回true(非0),如果失敗則返回false(0),如果執行失敗可調用GetLastError.函數獲得錯誤信息。*/二、MFC創建線程函數用戶界面線程和工作者線程都是由AfxBeginThread創建的。MFC提供了兩個重載版的AfxBeginThread,一個用于工作者線程,另一個用于用戶界面線程,分別有如下的原型和過程:
工作者線程的AfxBeginThread的原型如下:CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)其中:參數1 線程的入口函數,聲明一定要如下: UINT MyThreadFunction( LPVOID pParam );參數2 傳遞入線程的參數,注意它的類型為:LPVOID,所以我們可以傳遞一個結構體入線程.參數3、4、5分別指定線程的優先級、堆棧大小、創建標識、安全屬性,含義同用戶界面線程。用戶界面線程的AfxBeginThread的原型如下:CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)其中:參數1是從CWinThread派生的RUNTIME_CLASS類;參數2指定線程優先級,如果為0,則與創建該線程的線程相同;參數3指定線程的堆棧大小,如果為0,則與創建該線程的線程相同;參數4是一個創建標識,如果是CREATE_SUSPENDED,則在懸掛狀態創建線程,在線程創建后線程掛起,否則線程在創建后開始線程的執行。參數5表示線程的安全屬性,NT下有用。
新聞熱點
疑難解答
圖片精選