我們知道,要建立一個線程,必須得有一個主進程,然後由這個主進程來建立一個線程,在一般的VC程式中,主函數所在的進程就是程式的主進程。
讓我們從主函數來開始編寫我們這個簡單的小程式。我們知道CreateThread函數可以用來建立一個線程,在MSDN中尋找這個函數得到如下資訊:"The CreateThread function creates a thread to execute within the address space of the calling process."和"If the function succeeds, the return value is a handle to the new thread."所以我們得定義一個控制代碼用來存放它的傳回值。還定義一個指向線程ID的DWORD值dwThreadId。然後我們就可以用CreateThread函數來建立我們的線程了,CreateThread函數有六個參數分別是
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes
DWORD dwStackSize, // initial thread stack size
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to receive thread ID
其中第一個參數我們設定為NULL,使這個控制代碼不能被繼承;第二個參數設定為0,使用預設的堆棧大小;第三個參數為線程函數的起始地址,也就是線程函數的函數名;第四個參數為NULL,沒有值要傳遞給線程函數;第五個參數為0,建立好之後馬上讓線程運行;第六個參數設定為指向線程ID的地址。建立好線程之後,線程函數進行初始化之類的操作,主函數繼續執行,此時可以輸出被建立線程的ID。我們在主函數中用WaitForSingleObject函數來等待線程函數變成受信(signaled)狀態,它的兩個參數分別是
HANDLE hHandle, // handle to object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
第一參數為線程函數的控制代碼,第二個參數設定為INFINITE,等待線程一直執行完。在程式的最後還要記得用CloseHandle函數關閉線程,這樣主函數就寫完了。
線上程函數裡面我們可以簡單地做一些工作,比如設定一個迴圈,讓它輸出一定的資訊等。來源程式如下:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI ThreadFunc(HANDLE Thread)
{
int i;
for(i=0;i<10;i++)
{
cout<<"A new thread has created!"<<endl;
}
return 0;
}
int main(int argc,char* argv[])
{
HANDLE Thread;
DWORD dwThreadId;
Thread=::CreateThread
(NULL,0,ThreadFunc,NULL,0,&dwThreadId);
cout<<"The new thread ID is :"<<dwThreadId<<endl;
::WaitForSingleObject(Thread,INFINITE);
::CloseHandle(Thread);
return 0;
}
——轉自http://blog.csdn.net/richard_2010/archive/2006/03/05/616143.aspx