我们知道,要创建一个线程,必须得有一个主进程,然后由这个主进程来创建一个线程,在一般的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; }
在Window xp sp2&VC++ 6.0环境下编译通过。 |