c++使用_beginthreadex创建线程

2024-06-08 15:52

本文主要是介绍c++使用_beginthreadex创建线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 记录使用_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博客

这篇关于c++使用_beginthreadex创建线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042632

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安