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

news/2024/11/16 22:42:23/

说是多线程库,其实就是一个单独的.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.ppmy.cn/news/1547559.html

相关文章

Flume1.9.0自定义拦截器

需求 1、在linux日志文件/data/log/moreInfoRes.log中一直会产生如下JSON数据&#xff1a; {"id":"14943445328940974601","uid":"840717325115457536","lat":"53.530598","lnt":"-2.5620373&qu…

服务器能支持承载多少访问量??

服务器能支持承载的访问量是一个受多种因素影响的复杂问题。 以下是对该问题的详细分析&#xff1a; 一、关键影响因素 服务器的硬件配置&#xff1a; 处理器性能&#xff1a;服务器的CPU性能决定了其处理请求的速度和能力。高性能的CPU能够更快速地处理并发请求&#xff0c;…

提升治超站效率:因泰立科技激光式车辆长宽高检测系统

ILS-04激光式车辆长宽高检测系统是因泰立科技自主研发的一套全自动车辆长宽高检测系统。已广泛地应用于固定式治超站、高速公路入口治超站、非现场执法站、物料场、停车场的车辆长宽高检测。 激光车辆检测技术的优点&#xff1a;检测精度明显高于目前同类的非接触检测技术如微波…

C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 initializer_list表达式、tuple元组、pair对组再C日常还是比较常用的&#xff0c;尤其是对组在刷算法还是挺好用的&#xff0c;这里做一个简介&#xff1b;这三个语法结合C17的结构化绑定会更好用&#xff…

创客节初中组C++模拟题

来源:加码未来2024年深圳罗湖区创客节模拟题(初中组) 第一题 题目描述 通常为了节约时间,我们会用一个字母代替一个单词,比如Y代替Yes,N代替No。给出一个字母,输出其代替的单词 输入格式 一个字母,可能为大写或小写,但只会是yYnN之一。 输出格式 Yes 或 No 样例输…

HTML(超文本标记语言)

HTML&#xff08;超文本标记语言 - HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。 HTML 最初是由蒂姆・伯纳斯 - 李&#xff08;Tim Berners - Lee&#xff09;在 1990 年左右开发的。当时的目的是为了让世界各地的科学家能够方便地共享和交流信息…

深度学习每周学习总结J5(DenseNet-121 +SE 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 0. 总结 数据导入及处理部分&#xff1a;本次数据导入没有使用torchvision自带的数据集&#xff0c;需要将原始数据进行处理包括数据导入…

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…