记录使用_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..."<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
#include
#include
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::..."<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博客