WIN32多线程编程( CreateThread 版本)
来源:互联网 发布:js循环table tr 编辑:程序博客网 时间:2024/05/17 06:23
WIN32多线程编程( CreateThread 版本)
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是唯一的,但句柄可能不止一个
);
一、线程的创建、运行与结束
示例代码:
#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
- WIN32多线程编程( CreateThread 版本)
- Win32多线程之CreateThread
- 多线程编程(一)——CreateThread
- CreateThread多线程编程测试
- 多线程编程 CreateThread
- 多线程编程一---CreateThread透析
- 多线程编程 - 从 CreateThread 说起
- CreateThread简单那多线程编程
- CreateThread简单那多线程编程
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- c++中的多线程编程技术Createthread()
- 多线程编程(1)- 从 CreateThread 说起
- 多线程编程(2) - 从 CreateThread 说起[续]
- 一步一步学习多线程编程之CreateThread
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- VS winapi C++多线程同步编程 CreateThread
- linux之cut用法
- selenium_webdriver(python)获取元素属性值,浏览器窗口控制、网页前进后退,title/url打印
- C++重载运算操作符示例
- VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术
- 常用命令
- WIN32多线程编程( CreateThread 版本)
- 从gui_start_timer函数来看函数指针、指针函数、回调函数
- java中this关键词
- UDP 通信 例子
- 正则表达式(Regular Expression)基本语法
- 数据仓库中拉动查询性能的三驾马车
- Unity3D之AssetBundle资源加载封装
- Android中动态drawable样式
- list<string>转换成list<int>类型