windows api多線程
線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
以上來自百度百科。多線程技術會讓程序變得更加強大,是單線程永遠無法實現的。例如,在命令行中,用戶正在響應getchar函數,而我需要在用戶輸入的同時將命令行標題改為現在的時間,這個效果是單線程永遠不可能達到的。學習了本教程的內容,上面的例子就不難做到。
首先,認識API函數CreateThread:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
參數及其復雜,但事實上在普通的編程中大多數參數基本不需要用到。直接看示例代碼:
void Thread1()
{
while(1)
{
system("title %time%");
}
}
void main(int argc, char* argv[])
{
HANDLE hThread;
DWORD ThreadID;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ThreadID);
getchar();
}
(如果提示getchar未定義,請加入stdio.h頭文件)
是否實現了我們例子中想要的效果?讓我們來分析一下代碼。
首先,在main函數中使用API函數CreateThread創建了一個線程,線程的內容就是執行Thread1函數(參數三),然後就到了getchar函數中等待用戶的輸入完成。而在此同時,剛剛創建的線程正在執行Thread1函數的內容,就是不斷地將命令行標題設置為當前時間。於是,我們的效果便達成了。
CreateThread返回的是線程的HANDLE,示例代碼中是保存在hThread變量中。CreateThread會將第五個參數設置為線程的ID。線程的HANDLE和ID都是很重要的參數,對以後線程的其他操作有很重要的意義。
-----------------------------------------------------------------------分割線----------------------------------------------------------------------------------------------------------------------
CreateThread參數說明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // [in,可選] 句柄是否可被繼承 ,為NULL則不可被繼承
DWORD dwStackSize, //堆棧的初始大小,如為0系統自動分配
LPTHREAD_START_ROUTINE lpStartAddress, //指向由線程執行的應用程序定義函數的指針。
LPVOID lpParameter, //指向要傳遞給線程的變量的指針。
DWORD dwCreationFlags, //控制線程創建的標誌。為0該線程在創建後立即運行;其它可選標誌看下文.
LPDWORD lpThreadId //指向接收線程標識符的變量的指針。如果此參數為 NULL,則不返回線程標識符。
);
DWORD dwCreationFlags //可選標誌
- 0 該線程在創建後立即運行。
- CREATE_SUSPENDED(0x00000004) 該線程在掛起狀態下創建,並且不會運行,直到 ResumeThread函數被調用。
- STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000) 在所述dwStackSize參數指定堆棧的初始保留大小。如果未指定此標誌,則dwStackSize指定提交大小。
-----------------------------------------------------------------------分割線----------------------------------------------------------------------------------------------------------------------
那麽,再介紹幾個API函數,這幾個函數比較簡單,請讀者們自由測試:
DWORD SuspendThread(
HANDLE hThread
);
這個是掛起線程的API函數,用於暫停線程的執行。參數為創建線程時返回的線程HANDLE。
DWORD ResumeThread(
HANDLE hThread
);
這個是繼續執行線程的API函數,用於將已經掛起的線程恢復執行,與SuspendThread對應。參數為創建線程時返回的線程HANDLE。
VOID ExitThread(
DWORD dwExitCode
);
這個是停止(銷毀)線程的API函數,只能在線程內部使用。參數為退出碼,一般可設為0。
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
這個是強行停止(銷毀)線程的API函數,能在程序的任意部分使用。但是使用這一API函數來終止線程是不安全的,可能造成程序不穩定。不推薦使用。參數一為創建線程時返回的線程HANDLE,參數二為退出碼,一般可設為0。
windows api多線程