c++使用_beginthreadex创建线程

打印 上一主题 下一主题

主题 556|帖子 556|积分 1668

 记录使用_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
  代码设计

根据以上的相关先容来创建一个线程
  1. bool Thread::start()
  2. {
  3.         unsigned int thd;
  4.         tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
  5.         return tid != NULL;
  6. }
复制代码
Thread::execute() 是要运行的线程函数
  1. void Thread::run()
  2. {
  3.         int i = 1000;
  4.         while (i>0)
  5.         {
  6.                 std::cout << "run::%d..."<<i<<std::endl;
  7.                 i--;
  8.         }
  9. }
  10. void Thread::execute(void*thread)
  11. {
  12.         ((Thread*)thread)->run();
  13.         CloseHandle((HANDLE)((Thread*)thread)->tid);
  14. }
复制代码
Thread::run(),此函数为要运行的逻辑代码 
等待一个线程

相关函数先容

   DWORD WaitForSignleObject( HANDLE hHandle, DWORD dwMilliseconds );
参数阐明:
    hHandle表示要等待检查的对象句柄;
    dwMillseconds表示该函数等待的限期;
  
函数功能阐明:
          该函数是用来等待指定的对象被触发或函数超时。若dwMilliseconds设置为无限大INFINITE则该函数一直等待下去直到对象被触发。
  
函数返回值:
  WAIT_OBJECT_0表示函数乐成执行且指定的对象被触发处于signaled有信号状态;
 WAIT_TIMEOUT表示函数乐成执行但超时且对象没有被触发处于nonsignaled无信号状态;
  WAIT_FAILED表示函数执行失败,通常是由hHandle句柄不可用,可以调用GetLastError()检察。
  代码设计

  1. bool Thread::join()
  2. {
  3.         HANDLE ttid = (HANDLE)tid;
  4.         if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
  5.         {
  6.                 tid = 0;
  7.                 return true;
  8.         }
  9.         return false;
  10. }
复制代码
 代码的整体设计

线程类的声明

  1. //Thread.h
  2. #pragma once
  3. class Thread
  4. {
  5. public:
  6.         Thread();
  7.         virtual ~Thread();
  8.         bool start();
  9.         bool join();
  10.         virtual void run();
  11.         static void execute(void*);
  12. private:
  13.         volatile void* tid;
  14. };
复制代码
线程类的实现

  1. //Thread.cpp#include"Thread.h"#include <process.h>#include<windows.h>#include <iostream> Thread::Thread(){}Thread::~Thread(){}bool Thread::start()
  2. {
  3.         unsigned int thd;
  4.         tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
  5.         return tid != NULL;
  6. }bool Thread::join()
  7. {
  8.         HANDLE ttid = (HANDLE)tid;
  9.         if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
  10.         {
  11.                 tid = 0;
  12.                 return true;
  13.         }
  14.         return false;
  15. }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);}
复制代码
测试

  1. #include"Thread.h"
  2. int main()
  3. {
  4.         Thread* PThread = new Thread();
  5.         PThread->start();
  6.         PThread->join();
  7.         return 0;
  8. }
复制代码
测试效果

 此类,也可以做基类,通过继承重载run()操作,实现不同的操作
参考资料

C++ 使用_beginthreadex创建线程、线程句柄(等待线程关闭)、线程id的作用(发送线程消息)_c process.h 线程 等待线程竣事-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表