9.2.2 创建/终止线程的技巧
1.问题阐述
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行及什么时候执行线程,线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样可使处理器任务平衡,并提高系统的运行效率。
2.实现技巧
创建用户界面线程有两种方法。第一种方法,首先从CWinTread类派生一个类(注意,必须要用宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE对该类进行声明和实现);然后调用函数AfxBeginThread创建CWinThread派生类的对象进行初始化,启动线程运行;第二种方法,先通过构造函数创建类CWinThread的一个对象,然后由程序员调用函数::CreateThread来启动线程。
调用CreateProcess函数创建新的进程,运行指定的程序。
CreateProcess的原型如下:
BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); |
终止一个线程有两种方法:最常用的方法是调用函数ExitThread()结束线程;另一种方法是调用函数TerminateThread终止线程。在当前线程中的一个线程调用函数ExitProcess就会结束当前线程:
VOID ExitThread(DWORD dwExitCode); |
这个函数用来结束当前线程,其中参数用来存放此线程的退出码,这是最正常的结束线程的方法:
BOOL TerminateThread( HANDLE hThread. // 线程句柄 DWORD dwExitCode // 线程退出码 );
|
3.实例代码
#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; } |
4.小结
我们知道,要创建一个线程,必须得有一个主进程,然后由这个主进程来创建一个线程,在一般的VC程序中,主函数所在的进程就是程序的主进程。
【责任编辑:
夏书 TEL:(010)68476606】