一个win32 / WTL下多线程库(CThread类)的使用心得

说是多线程库,其实就是一个单独的.h文件,可以方便的放入WTL/win32工程中。

下载地址:CThread. 里面也简单介绍了 用法。

具体用法,首先自定义一个子线程类继承CThreadImpl<T>,注意他是个模板类。

class CMySubThread:public CThreadImpl<CMySubThread>

 然后,在类中定义需要的成员变量,比如,一般都要有一个窗口句柄,这个窗口就是你这个子线程要和哪个窗口进行交互,或者子线程的执行结果要返回给哪个窗口。

重写父类的Run方法,子线程启动后,就执行这个Run方法。

简单起见,我的子线程类定义如下:

#pragma once
class CMySubThread:public CThreadImpl<CMySubThread>
{
public:CMySubThread();DWORD Run();DWORD i;HWND m_hWnd;};

类实现也比较简单:

#include "stdafx.h"
#include "MySubThread.h"CMySubThread::CMySubThread()
{i = 0;m_hWnd = NULL;
}DWORD CMySubThread::Run()
{int i = 0;while (!IsAborted()) {::Sleep(2000);::PostMessage(m_hWnd, WM_THREAD, WPARAM(i++), NULL); }return 0;
}

说一下Run方法:是一个循环,只要没在外部调用子线程的Stop方法,子线程就一直运行。循环里就是把自增变量 i 通过win32自定义消息的方式发送给窗口。一旦在外部什么地方调用子线程的Stop()方法,循环就退出了,子线程执行结束。

在类的外部,比如在主窗口(对话框)类CMainDlg中(由于我用的是WTL库,主窗口类名叫这个),定义一个子线程对象

CMySubThread m_thread;

在合适的地方把m_thread对象的窗口句柄变量赋值为主窗口句柄,然后在合适的地方启动子线程:

m_thread.m_hWnd = m_hWnd;
m_thread.Start();

这样,子线程就运行起来了。

注意事项:

1、可以只定义一个子线程对象,然后多次调用Start()方法,运行多个子线程。

2、多个子线程中的变量数据是单独的,有自己的地址空间,不干扰。按上面的例子说,就是启动两个子线程的话,变量i 都是从0开始,各自自增。

3、重点1:如果子线程是个死循环,或非常耗时的操作,比如Run方法这样:

DWORD CMySubThread::Run()
{int i = 0;while (true) {::Sleep(2000);::PostMessage(m_hWnd, WM_THREAD, WPARAM(i++), NULL); }return 0;
}

这种情况下,调用子线程的Stop()方法是无法结束子线程的,主线程也会卡在Stop()这里,一直等子线程结束。所以不推荐子线程写个死循环,一般写成

while (!IsAborted())

4、重点2:写成这样还有个好处,就是当启动多个子线程时,可以在窗口结束前调用一次Stop,这样所有的子线程都退出结束了。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PySide6百练成真(9)

资源的加载 给控件加上图标 1.内置图标 2.自定义资源文件 3.Rcc的使用(基于designer) 4.如果获取资源文件 rcc的使用,基于xml文件 内置图标 from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QLineEdit, QToolBox, QMainWindow, QPushButton,QSt…

cmake vscode

cmake_minimum_required(VERSION 3.20.0) project(my_hello) //指定项目 set(CMAKE_CXX_STANDARD 11) //指定c的版本 include_directories( P R O J E C T S O U R C E D I R / i n c l u d e ) / / 包含头文件的目录 / / 指定可执行文件生成目录 s e t ( E X E C U T A B L E…

李耳著《老子》与董仲舒著《道德经》有何区别?

马王堆帛书《老子》的发现&#xff0c;确实为研究《道德经》提供了更为接近原始的版本&#xff0c;其内容与传世本存在诸多不同之处&#xff0c;这些差异不仅体现在文字和篇章结构上&#xff0c;更在于思想内涵和哲学意蕴的深度。以下是具体分析&#xff1a; 版本命名&#xff…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…

游戏行业使用高防独立IP有什么好处?

独立的IP就是您的虚拟主机自己有一个单独的IP地址&#xff0c;这样&#xff0c;您的用户除了记住您的域名外&#xff0c;在浏览器的地址栏敲入您的IP地址也能访问到您的网站。如果没有独立IP的话&#xff0c;别人要访问您的网站只能敲入域名才行。 而高防ip是指高防机房所提供的…

Android ANR分析总结

1、ANR介绍 ANR&#xff08;Application Not Responding&#xff09;指的是应用程序无响应&#xff0c;当Android应用程序在主线程上执行长时间运行的操作或阻塞I/O操作时发生。这可能导致应用程序界面冻结或无法响应用户输入。 1、Service ANR&#xff1a;前台20s&#xff0…

【comfyui教程】comfyui攻略:故障报错应对指南!

前言 ComfyUI的常见故障和解决&#xff0c;赶紧收藏起来&#xff0c; 在探索ComfyUI的曲折旅途中&#xff0c;最让人心生畏惧的莫过于那漫天的红色方框和层出不穷的报错信息。它们如同不息的风暴&#xff0c;一波未平&#xff0c;一波又起&#xff0c;令无数热忱的初学者在这…

[论文精读]SeqMIA: Sequential-Metric Based Membership Inference Attack

图像领域成员推理攻击 SeqMIA: Sequential-Metric Based Membership Inference Attack http://arxiv.org/abs/2407.15098 ACM CCS 2024 先看overview&#xff0c;猜测文章的方法&#xff1a;训练影子模型&#xff0c;使用影子模型、蒸馏数据集和目标模型共同参与蒸馏任务&am…

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transform 3.特征…

watermark大模型水印详解

一 watermark定义 模型水印是一种用于模型版权保护的技术&#xff0c;通过向大模型植入水印&#xff08;触发集数据加上特定的噪声或者标志&#xff09;&#xff0c;使得模型学习到这种特定的噪声或者标志的特征&#xff0c;通过特定的问题可以从大模型的回答中提取出水印进行…

做运维工程师辛苦吗?

你要知道做那一块的运维 网络运维&#xff08;确保网络稳定安全&#xff09; 应用运维&#xff08;应用软件进程监控、服务和端口相应情况、故障处理等&#xff09; 系统运维&#xff08;操作系统监控 恢复 等&#xff09;、 桌面和外围设备运维&#xff08;计算机终端、外…

关于报错‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

在使用ANT DESIGN PRO这个react框架时出现了cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 如图&#xff1a; 解决办法&#xff1a; 需要全局安装 cross-dev npm install -g cross-env -save-dev 然后重新启动npm start 注意&#xff1a;…

智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题

1. 背景 智能座舱多屏项目&#xff0c;中控屏切换语言&#xff0c;后排屏闪黑屏问题 2. 详细分析过程 通过events log查看activity的生命周期&#xff1a;adb shell logcat -b events com.android.rwhvac.view.behind.BehindActivity2 : displayId 2 副屏app com.android.…

基于Multisim温度计温度测量检测测量系统电路(含仿真和报告)

【全套资料.zip】温度计温度测量检测测量系统电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 温度检测测量系统 1.温度测量范围为0&#xff5e;200&#xff23;&#xff1b; 2.三位数…

浅层神经网络

浅层神经网络 浅层神经网络通常指包含一个隐藏层的神经网络。这个网络由输入层、隐藏层和输出层构成&#xff1a; 输入层&#xff1a;输入层负责接收网络的输入特征&#xff0c;通常表示为列向量 x T [ x 1 , x 2 , x 3 ] x^T [x_1, x_2, x_3] xT[x1​,x2​,x3​]&#xff…

解决apidoc不是内部或外部命令,也不是可运行的程序 或批处理文件。

apidoc官网 首先确保安装了apidoc,我这里是全局安装的。 npm install apidoc -g然后打开cmd窗口执行命令时就会报错。 apidoc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 此时只需要找到它&#xff0c;再把它加入环境变量即可了。 win10中npm默认路径:C:\User…

可私有化部署API的集装箱箱号自动识别技术,专业算法厂家

启智畅想作为人工智能行业OCR识别算法厂家&#xff0c;可将集装箱箱号自动识别技术私有化部署&#xff0c;并提供私有化部署的API的接口&#xff0c;在物流行业中正逐渐崭露头角&#xff0c;成为提升效率与精度的关键力量。这一技术不仅打破了传统识别方式的局限&#xff0c;更…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里&#xff1f; 1、一个问题&#xff1a; 2、查看消费者消费主题__consumer_offsets 3、一个重要前提&#xff1a;消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了&#xff0c;你重启kafka之后&#xff0…

第七届中国国际进口博览会 2024长三角G60科创走廊高质量发展要素对接大会举行

11月9日&#xff0c;第七届中国国际进口博览会2024长三角G60科创走廊高质量发展要素对接大会在国家会展中心举行。会上&#xff0c;G60科创走廊九城市共赴进博之约&#xff0c;以全面深化改革为动力&#xff0c;深入推进长三角G60科创走廊走深走实&#xff0c;携手推动科技创新…

一键P图新神器!SeedEdit让图片编辑更快捷!

大家还记得MJ推出的图片编辑功能吗&#xff1f;只需涂抹想要修改的区域&#xff0c;再输入提示词&#xff0c;就能一键更改原图。而现在&#xff0c;豆包大模型团队也推出了类似的功能——SeedEdit&#xff0c;而且更加简单快捷&#xff01; Ai 智能办公利器 - Ai-321.com 人工…