標籤:命令 控制 線程 代碼 term 參數設定 工作 argv 存在
線程是程式中一個單一的順序控制流程程。在單個程式中同時運行多個線程完成不同的工作,稱為多線程。
以上來自百度百科。多線程技術會讓程式變得更加強大,是單線程永遠無法實現的。例如,在命令列中,使用者正在響應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多線程