当前位置: 首页 > news >正文

一个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.lryc.cn/news/482672.html

相关文章:

  • 使用wordpress搭建简易的信息查询系统
  • PAT甲级 1076 Forwards on Weibo(30)
  • 揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
  • 使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。
  • 杂谈:业务说的场景金融是什么?
  • 在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换
  • 【ESP32+MicroPython】硬件控制基础
  • Python学习从0到1 day26 第三阶段 Spark ① 数据输入
  • kafka消费者的消费分区策略有哪些,默认是哪个?
  • 前端常用时间操作汇总
  • 106. UE5 GAS RPG 使用MVVM
  • Elasticsearch中什么是倒排索引?
  • 深度学习:AT Decoder 详解
  • pythons工具——图像的随机增强变换(只是变换了图像,可用于分类训练数据的增强)
  • C++中volatile限定符详解
  • 如何关闭Python解释器
  • 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
  • 渗透测试---网络基础之HTTP协议与内外网划分
  • 15分钟学 Go 第 45 天 : 使用Docker容器
  • DriveLM 论文学习
  • YoloV10改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
  • 光模块基础知识
  • 【go从零单排】Closing Channels通道关闭、Range over Channels
  • 初始JavaEE篇 —— 文件操作与IO
  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • HarmonyOS ArkTS 下拉列表组件
  • zabbix监控Linux系统
  • 线性表-数组描述补充 迭代器(C++)
  • vue3 + element-plus 的 upload + axios + django 文件上传并保存
  • dm 创建数据库实例【window】