WIN32多线程编程( CreateThread 版本)

来源:互联网 发布:js循环table tr 编辑:程序博客网 时间:2024/05/17 06:23
WIN32多线程编程( CreateThread 版本

一、线程的创建、运行与结束

示例代码:
#include <stdio.h>#include <windows.h>DWORD WINAPI ThreadFun(LPVOID pM){     printf("%s\n", pM);     return 0;}int main(){     printf("main thread\n");     HANDLE handle1 = CreateThread(NULL, 0, ThreadFun, "Thread one", 0, NULL);     HANDLE handle2 = CreateThread(NULL, 0, ThreadFun, "Thread two", 0, NULL);     DWORD exitCode1 = 0, exitCode2 = 0;     while(1){          GetExitCodeThread(handle1, &exitCode1);          GetExitCodeThread(handle2, &exitCode2);          if(exitCode1 != STILL_ACTIVE && exitCode2 != STILL_ACTIVE)               break;     }     CloseHandle(handle1);     CloseHandle(handle2);     system("PAUSE");     return 0;}

解析:
1、CreateThread 包含在 windows.h 头文件中;
2、线程函数为 DWORD WINAPI (*ThreadFun)(LPVOID pM ) 类型,一个线程函数可以被多个线程调用;
3、线程创建函数为CreateThread( ),其具体参数如下:
     HANDLE CreateThread(                                       // 返回线程句柄 
          LPSECURITY_ATTRIBUTES lpThreadAttributes,    // 安全设置,一般设为NULL以使用默认安全性
          SIZE_T dwStackSize,                                    // 初始栈大小(堆是公用的栈是私有的),设为0表示使用系统默认的大小(即和主线程的栈大小相同),使用过程中若空间不足系统则会自动给其分配
          LPTHREAD_START_ROUTINE lpStartAddress,      // 线程函数    
          LPVOID lpParameter,                                     // 线程传入参数 ,类型是void型指针   
          DWORD dwCreationFlags,                               // 启动选项,0代表立即执行,CREATE_SUSPENDED代表线程创建后挂起等待。每个线程均有一个状态标识数,挂起一次计数加一,恢复一次计数减一,最小为0。 ResumeThread(HANDLE thread)恢复线程运行,SuspendThread(HANDLE thread )挂起线程。
          LPDWORD lpThreadId                                    // 线程ID,默认为NULL,线程的ID是唯一的,但句柄可能不止一个
    ); 
4、获取线程运行参数GetExitCodeThread ( HANDLE handle, LPDWORD &exitCode ),exitCode存储线程状态,STILL_ACTIVE代表线程正在执行。若线程已结束,则exitCode保存线程的返回值。
5、关闭线程 CloseHandle ( HANDLE handle ).

二、向线程函数传递多个“参数”

思路:
        线程函数已规定传入参数为一个void型指针,故我们只能对需要传递给线程函数的多个参数进行封装组合,于是自然而然的想到了结构体。首先我们定义一个传入结构体 TransData,里面包含所有我们需要传给线程函数的参数,最好也定义一个构造函数,方便后面创建对象。接着创建对象指针,结合之前的构造函数以及new操作。然后将该对象指针强制转换为void型指针并作为CreateThread( )的第四个参数。最后在ThreadFun( )中将传入的pM指针强制转换成 TransData 指针并依次获取想要的参数。

示例代码:
#include <stdio.h>#include <string.h>#include <windows.h>struct TransData{     int ID;     char Name[100];         TransData(int id,  char *name)     {          ID = id;          strcpy(Name, name);     }};DWORD WINAPI ThreadFun(LPVOID pM){     TransData *data = (TransData *) pM;     printf("ID: %d\n", data->ID);     printf("Name: %s\n", data->Name);     return 0;}int main(){     printf("main thread\n");         TransData *data = new TransData(23, "Michael Jordan");     HANDLE handle = CreateThread( NULL, 0, ThreadFun,(void *)data, 0, NULL);     DWORD exitCode ;     while(1){          GetExitCodeThread(handle, &exitCode);          if(exitCode != STILL_ACTIVE)               break;     }     CloseHandle(handle);     system("PAUSE");     return 0;}
0 0
原创粉丝点击