HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTRIBUTES 的指針,為新線程指定安全描述 __in SIZE_T dwStackSize, // 初始化線程堆棧尺寸 __in LPTHREAD_START_ROUTINE lpStartAddress, //線程函數所指向的地址起始函數 __in_opt LPVOID lpParameter, // 給線程函數傳遞的參數 __in DWORD dwCreationFlags, // 有關線程的標志 __out_opt LPDWORD lpThreadId //系統分配給線程的ID );
----第一個參數是安全屬性,一般設為null,使用缺省的安全屬性。當我們想此線程有另外的子進程時,可改變它的屬性。
----第二個參數是線程堆棧尺寸,一般設為0,表示與此應用的堆棧尺寸相同,即主線程與創建的線程一樣長度的堆棧。並且其長度會根據需要自動變長。
----第三個參數,也是最重要的一個,是一個指向函數名的指針,或者函數名字
----第四個參數是你需要向線程函數傳遞的參數,一般是一個指向結構的指針。不需傳遞參數時,則這個參數設為null。
----第五個參數,傳入與線程有關的一些標志,如果是CREATE_SUSPENDED,則創建一個掛起的線程,即這個線程本身已創建,它的堆棧也已創建。
但這個線程不會被分配給CPU時間,只有當ResumeThread函數被調用後才能執行;當然,也可以調用SuspendThread函數再次掛起線程。要是標志為0,那麼一旦建立線程,線程函數就被立即調用。一般傳為0即可。
----第六個參數是系統分配給這個線程的唯一的ID標志
事件對象就像一個開關:它只有兩種狀態---開和關。當一個事件處於”開”狀態,我們稱其為”有信號”否則稱為”無信號”。可以在一個線程的執行函數中創建一個事件對象,然後觀察它的狀態,如果是”無信號”就讓該線程睡眠,這樣該線程占用的CPU時間就比較少。
產生事件對象的函數如下:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
);
該函數創建一個Event同步對象,如果CreateEvent調用成功的話,會返回新生成的對象的句柄,否則返回NULL。
參數說明:
lpEventAttributes 一般為NULL
bManualReset 創建的Event是自動復位還是人工復位.如果true,人工復位, 一旦該Event被設置為有信號,則它一直會等到ResetEvent()API被調用時才會恢復 為無信號. 如果為false,Event被設置為有信號,則當有一個wait到它的Thread時, 該Event就會自動復位,變成無信號. 如果想 在每次調用WaitForSingleObject 後讓WINDOWS為您自動地把事件地狀態恢復為”無信號”狀態,必須把該參數設為FALSE,否則,您必須每次調用ResetEvent函數來清除事件 的信號。
bInitialState 初始狀態,true,有信號,false無信號
lpName 事件對象的名稱。您在OpenEvent函數中可能使用。
通過WaitForSingleObject或者GetOverlappedResult來判斷事件,從而控制線程。