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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D打印随形透气钢:技术革新引领模具制造新潮流

在模具制造领域&#xff0c;透气钢一直扮演着重要角色&#xff0c;它能够有效解决模具困气问题&#xff0c;提高注塑成型的效率和质量。然而&#xff0c;传统的透气钢制造方法受限于工艺和材料&#xff0c;难以满足复杂模具的需求。随着3D打印技术的飞速发展&#xff0c;3D打印…

Go微服务: 分布式之通过本地消息实现最终一致性

概述 我们的业务场景是可以允许我们一段时间有不一致的消息的状态的&#xff0c;并没有说必须特别高的这个消息的一致性比如说在TCC这个架构中&#xff0c;如果采用了消息的最终一致性&#xff0c;整体架构设计要轻松好多即便我们库存服务挂了&#xff0c;或者我们积分服务挂了…

【2024PythonPycharm详细安装教程】

1.打开官网 https://www.python.org/ downloads——>Windows 2.找到 Download Windows installer (64-bit) 下载 3.下载完成双击安装包 勾选Add python.exe to PATH(自动配置系统变量) 点击Install Now&#xff08;默认安装&#xff09; 然后看到安装成功&#xff0…

LeetCode-day05-3038. 相同分数的最大操作数目 I

LeetCode-day05-3038. 相同分数的最大操作数目 I 题目描述示例示例1&#xff1a;示例2&#xff1a; 思路代码 题目描述 给你一个整数数组 nums &#xff0c;如果 nums 至少 包含 2 个元素&#xff0c;你可以执行以下操作&#xff1a; 选择 nums 中的前两个元素并将它们删除。…

深度学习中2D检测

深度学习中的2D目标检测 2D目标检测是深度学习中的一个关键任务&#xff0c;旨在识别图像中的目标对象&#xff0c;并在每个目标对象周围生成一个边界框。该任务在自动驾驶、视频监控、机器人视觉等领域具有广泛应用。以下是对深度学习中2D目标检测的详细介绍&#xff0c;包括…

通过windbg查看dump文件中静态变量的值

可以使用 WinDbg 和 SOS 扩展来查看它们。下面是如何使用 WinDbg 和 SOS 的步骤&#xff1a; 打开 WinDbg&#xff0c;并用它打开你的 dump 文件。你可以使用 File → Open Crash Dump 来实现。 在命令行中&#xff0c;加载 SOS 扩展。一般来说这可以通过 .loadby sos clr 来完…

Oracle EBS AP发票创建会计科目错误:子分类帐日记帐分录未按输入币种进行平衡

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 提交“创建会计科目”请求提示错误信息如下: 中文报错: 该子分类帐日记帐分录未按输入币种进行平衡。请检查日记帐分录行中输入的金额。 英文报错:The subledger journal entry does not balance i…

excel vlookup

Excel中的VLOOKUP函数用于在数据表中查找特定值&#xff0c;并返回该值所在行的另一个单元格中的值。这个函数非常有用&#xff0c;特别是在需要从一张表中查找信息并将其填充到另一张表中的情况下。VLOOKUP函数的基本语法是&#xff1a;VLOOKUP(查找值, 数据范围, 返回值的…

PS的stable diffusion插件安装指南

PS的stable diffusion插件安装指南 1.首先要安装stable diffusion&#xff0c;具体安装方法&#xff0c;参考https://blog.csdn.net/sheji888/article/details/139196688 stable diffusion要求要启用API功能 2.安装ps2023以上版本&#xff0c;低于这个版本不能使用stable diff…

17- Redis 中的 quicklist 数据结构

在 Redis 3.0 之前&#xff0c;List 对象的底层数据结构是双向链表或者压缩列表&#xff0c;然后在 Redis 3.2 的时候&#xff0c;List 对象的底层改由 quicklist 数据结构实现。 其实 quicklist 就是【双向链表 压缩列表】组合&#xff0c;因为一个 quicklist 就是一个链表&…

什么是ESG?

什么是ESG&#xff1f; ESG的实施和发展是企业应对全球和国内环境、社会和治理挑战的关键路径。《ESG入门一本通》详细阐述了ESG的概念、发展历程和评价体系&#xff0c;并结合中国的实际情况&#xff0c;强调了ESG的重要性和必要性。企业需重视ESG管理和信息披露&#xff0c;…

详细分析Mysql中的JSON_OBJECT() 基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增删改常用语法语句&#xff08;全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;命令行登录Mysql的详细讲解 1. 基本知识 JSON_OBJECT() 是 MySQL 中用于生成 JSON 对象…

信息系统项目管理师0149:输入(9项目范围管理—9.4收集需求—9.4.1输入)

点击查看专栏目录 文章目录 9.4 收集需求9.4.1 输入9.4 收集需求 收集需求是为实现目标而确定,记录并管理干系人的需要和需求的过程。本过程的主要作用是为定义产品范围和项目范围奠定基础。本过程仅开展一次或仅在项目的预定义点开展。收集需求过程的数据流向如图 9-2 所示。…

「前端+鸿蒙」鸿蒙应用开发简介

鸿蒙应用开发是指使用华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;提供的API和开发工具&#xff0c;创建可以在鸿蒙设备上运行的应用程序。鸿蒙系统是华为开发的全场景、分布式操作系统&#xff0c;它支持多种设备类型&#xff0c;包括智能手机、平板电脑、智能电视、智…

Spring (45)Gateway

在计算机网络中&#xff0c;一个网关&#xff08;Gateway&#xff09;是一个网络节点&#xff0c;它充当不同网络协议、应用程序或数据格式之间的转换点。在微服务架构中&#xff0c;API网关&#xff08;API Gateway&#xff09;扮演着非常关键的角色&#xff0c;它是微服务和外…

电脑开机出现英文字母,如何解决这个常见问题?

电脑开机时出现英文字母的情况通常意味着系统在启动过程中遇到了问题。这些英文字母可能是错误信息、系统提示或BIOS设置问题。通过理解这些信息并采取适当的措施&#xff0c;您可以解决大多数启动问题。本文将介绍三种解决电脑开机出现英文字母问题的方法&#xff0c;帮助您恢…

智能合约中未授权访问

未授权访问&#xff1a; 如果智能合约对关键函数的访问控制不足&#xff0c;攻击者可能执行不应允许的操作&#xff0c;如修改合约状态或提取资金。 未授权访问示例 假设我们有一个智能合约&#xff0c;用于管理用户的存款和提款。在这个例子中&#xff0c;合约没有正确地限…

python使用appium打开程序后,为什么没有操作后程序就自动退出了

当使用Appium打开应用程序并在没有执行任何操作后它自动退出&#xff0c;这可能是由于几个不同的原因。以下是一些可能的原因和相应的解决方案&#xff1a; 应用程序的默认行为&#xff1a; 有些应用程序在启动后如果没有用户交互&#xff0c;可能会因为超时或其他逻辑而自动关…

BGP汇总+认证

一、BGP 的宣告问题 1、在 BGP 协议中每台运行 BGP 的设备上&#xff0c;宣告本地直连路由 2、在 BGP 协议中运行 BGP 协议的设备来宣告.通过 IGP 学习到的&#xff0c;未运行 BGP 协议设备产2、生的路由&#xff1b; 在 BGP 协议中宣告本地路由表中路由条目时,将携带本地到达这…

Spring Boot集成geodesy实现距离计算

1.什么是geodesy&#xff1f; 浩瀚的宇宙中&#xff0c;地球是我们赖以生存的家园。自古以来&#xff0c;人类一直对星球上的位置和彼此的距离着迷。无论是航海探险、贸易往来还是科学研究&#xff0c;精确计算两个地点之间的距离都是至关重要的。 Geodesy&#xff1a;大地测量…