?記錄使用_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博客