Win32下的多线程技术
最直接的,就代码来说,一个线程简单的被表示为可能调用程序中其他函数的函数。程序从主线程开始,这个主线程是传统C程序中的main函数,或者windows下的winmain函数。一旦运行起来,程序可以通过在系统调用CreatThread中指定初始线程函数的名称来创建新的线程的执行。操作系统在线程之间抢占式的切换控制,和它在进程之间切换控制的方法非常类似。
每个线程可以创建一个消息队列,也可以不创建,如果希望从线程创建窗口,那么必须创建,否则,如果只是进行数据处理或者图形输出,那么不需要创建消息队列。因为无消息队列的进程无法处理消息,所以它们不会将系统挂起。唯一的限制是无消息队列的线程无法向其他的消息队列中的窗口发送消息,或者调用任何发送消息的函数(不过,它们可以讲消息传递给消息队列线程)。
1.创建新的执行线程的API函数是CreatThread,它的语法如下:
MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
参数说明:
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。
dwCreationFlags :线程标志,可取值如下
CREATE_SUSPENDED: 创建一个挂起的线程
0 :创建后立即激活。
lpThreadId:保存新线程的id。
返回值:
函数成功,返回线程句柄;函数失败返回false。
函数说明:
创建一个线程。
大多数windows程序员喜欢使用PROCESS.H头文件中说明的C运程时的库函数_beginthread。
它更简单,对于大多数应用程序很完美,这个线程函数的语法与_beginthread的语法已在上文中列出。