WIN32多线程编程( CreateThread 版本)

WIN32多线程编程( CreateThread 版本

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

示例代码:
#include 
#include 

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 
#include 
#include 

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;
}

你可能感兴趣的:(win32开发)