记录使用_beginthreadex(),来创建线程。方便后期的使用。
创建一个线程
相关函数先容
unsigned long _beginthreadex(
void *security, // 安全属性, 为NULL时表示默认安全性
unsigned stack_size, // 线程的堆栈巨细, 一般默以为0
unsigned(_stdcall *start_address)(void *), // 所要启动的线程函数
void *argilist, // 线程函数的参数, 是一个void*类型, 通报多个参数时用结构体
unsigned initflag, // 新线程的初始状态,0表示立即执行,CREATE_SUSPENDED
表示创建之后挂起
unsigned *threaddr // 用来吸取线程ID
);
返回值 : // 乐成返回新线程句柄, 失败返回0
代码设计
根据以上的相关先容来创建一个线程
- bool Thread::start()
- {
- unsigned int thd;
- tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
- return tid != NULL;
- }
复制代码 Thread::execute() 是要运行的线程函数
- void Thread::run()
- {
- int i = 1000;
- while (i>0)
- {
- std::cout << "run::%d..."<<i<<std::endl;
- i--;
- }
- }
- void Thread::execute(void*thread)
- {
- ((Thread*)thread)->run();
- CloseHandle((HANDLE)((Thread*)thread)->tid);
- }
复制代码 Thread::run(),此函数为要运行的逻辑代码
等待一个线程
相关函数先容
DWORD WaitForSignleObject( HANDLE hHandle, DWORD dwMilliseconds );
参数阐明:
hHandle表示要等待检查的对象句柄;
dwMillseconds表示该函数等待的限期;
函数功能阐明:
该函数是用来等待指定的对象被触发或函数超时。若dwMilliseconds设置为无限大INFINITE则该函数一直等待下去直到对象被触发。
函数返回值:
WAIT_OBJECT_0表示函数乐成执行且指定的对象被触发处于signaled有信号状态;
WAIT_TIMEOUT表示函数乐成执行但超时且对象没有被触发处于nonsignaled无信号状态;
WAIT_FAILED表示函数执行失败,通常是由hHandle句柄不可用,可以调用GetLastError()检察。
代码设计
- bool Thread::join()
- {
- HANDLE ttid = (HANDLE)tid;
- if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
- {
- tid = 0;
- return true;
- }
- return false;
- }
复制代码 代码的整体设计
线程类的声明
- //Thread.h
- #pragma once
- class Thread
- {
- public:
- Thread();
- virtual ~Thread();
- bool start();
- bool join();
- virtual void run();
- static void execute(void*);
- private:
- volatile void* tid;
- };
复制代码 线程类的实现
- //Thread.cpp#include"Thread.h"#include <process.h>#include<windows.h>#include <iostream> Thread::Thread(){}Thread::~Thread(){}bool Thread::start()
- {
- unsigned int thd;
- tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
- return tid != NULL;
- }bool Thread::join()
- {
- HANDLE ttid = (HANDLE)tid;
- if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
- {
- tid = 0;
- return true;
- }
- return false;
- }void Thread::run(){ int i = 1000; while (i>0) { std::cout << "run::..."<<i<<std::endl; i--; }}void Thread::execute(void*thread){ ((Thread*)thread)->run(); CloseHandle((HANDLE)((Thread*)thread)->tid);}
复制代码 测试
- #include"Thread.h"
- int main()
- {
- Thread* PThread = new Thread();
- PThread->start();
- PThread->join();
- return 0;
- }
复制代码 测试效果
此类,也可以做基类,通过继承重载run()操作,实现不同的操作
参考资料
C++ 使用_beginthreadex创建线程、线程句柄(等待线程关闭)、线程id的作用(发送线程消息)_c process.h 线程 等待线程竣事-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |