最近学习了MFC多线程的使用,

写了一个继承CWinThread类的类MyThread;

在头文件开头用#define定义一个线程函数入口地址(会在下面定义代码中写出)

在类的开头加上IMPLEMENT_DYNCREATE(MyThread, CWinThread)

继承的子类里面必须重写两个函数

一、virtual BOOL InitInstance();
二、virtual int ExitInstance();

声明一个线程函数,函数名自定,我的类中的线程函数叫StartThread

在声明完线程函数后再声明DECLARE_MESSAGE_MAP(),该函数包含了消息映射必要的函数,声明了它就相当于在类内声明了这些提供消息映射必要的函数。

头文件中类定义如下:

#ifndef T_THREAD_H
#define T_THREAD_H
#pragma once
#define WM_TEST WM_USER + 105 //定义线程函数入口地址
class mythread1 : public CWinThread
{
DECLARE_DYNCREATE(MyThread)
public:
MyThread();
virtual BOOL InitInstance();
virtual int ExitInstance();
void StartThread(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP();
};
#endif

然后在CPP文件开头加上IMPLEMENT_DYNCREATE(MyThread, CWinThread)

这样做的意图在于使能Cobject派生类的对象在运行时动态被创建。

然后在重写了

BOOL InitInstance();

int ExitInstance();

两个函数的定义后,在定义线程函数时加上下面的语句

BEGIN_MESSAGE_MAP(MyThread, CWinThread)
    ON_THREAD_MESSAGE(WM_TEST, StartThread)
END_MESSAGE_MAP()

这三条代码的作用是将线程消息传递路由定义好

关于这三条语句以及类中声明的消息映射函数我是参考这篇博客https://blog.csdn.net/luoti784600/article/details/10070939

cpp代码如下

#include "stdafx.h"
#include "t_thread.h"
IMPLEMENT_DYNCREATE(MyThread, CWinThread) MyThread::MyThread()
{ } BOOL MyThread::InitInstance()
{
return true;
}
int MyThread::ExitInstance()
{
return 0;
}
BEGIN_MESSAGE_MAP(MyThread, CWinThread)
ON_THREAD_MESSAGE(WM_TEST, StartThread)
END_MESSAGE_MAP()
void mythread1::StartThread(WPARAM wParam, LPARAM lParam)
{
while (true)
{
TRACE("2\n");
Sleep(1000);
}
::AfxEndThread(2015);
}

在线程内调用AfxEndThread将会直接结束线程,此时线程的一切资源都会被回收,函数的参数是nExitCode,可以通过GetExitCodeThread获得。

然后按键消息函数中开启线程,开启线程的方式是先声明定义一个线程类指针

MyThread* p_MyThread;

再用AfxBeginThread获得线程指针

p_MyThread= (MyThread*)AfxBeginThread(RUNTIME_CLASS(MyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

AfxBeginThread有两种重载函数定义,一种叫工作线程,一种叫用户界面线程,通过输入参数的不同区别,本例中使用的是用户界面线程,

关于AfxBeginThread两种函数定义的介绍,可以参考https://blog.csdn.net/MissXy_/article/details/80330263

按键消息函数内代码如下:

void CmythreadDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码 p_MyThread= (MyThread*)AfxBeginThread(RUNTIME_CLASS(MyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
p_MyThread->ResumeThread();
p_MyThread->PostThreadMessage(WM_TEST, NULL, NULL);
display();
}
void CmythreadDlg::display()
{
while (1)
{
TRACE("1\n");
Sleep(1000);
}
}

本例的意图是用两个线程,分别打印出1,2两个数字。

运行结果如下:

记录完毕,欢迎指出不足!

MFC多线程的创建使用的更多相关文章

  1. MFC 多线程

    MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息   队列和消息循环. 工作者线程没有消息机制,通 ...

  2. MFC多线程内存泄漏问题&解决方法

    在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个 ...

  3. Win32 多线程的创建方法和基本使用

    Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...

  4. MFC多线程各种线程用法 .

    http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleTh ...

  5. MFC多线程详细讲解(转)

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...

  6. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  7. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

  8. Python多线程的创建,相关函数和守护线程的理解

    一:多线程的创建 threading库创建线程有两种方式,函数式和继承式    1)函数式 def func(): print 'Starting' print 'Ending' t=threadin ...

  9. 深入浅出MFC——MFC多线程程序设计(七)

    1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每 ...

随机推荐

  1. bk复面-一场被问蒙蔽了的面试

    1.自我介绍         ---自我介绍从个人生活上.兴趣爱好上去介绍,比如我自己,平时喜欢听听音乐.看看鸡汤类的书,比如爱下厨,喜欢根据一些网上的教程去尝试做一份自己满意的晚餐,简历上已经写得工 ...

  2. Vue_(组件)过渡效果

    Vue.js进入/离开 & 列表过渡 传送门 进入/离开过渡效果:Vue在插入.更新或移除DOM时,可以设置一些动画效果: 过渡效果中也提供了对应的钩子函数,这些钩子函数需要在<tran ...

  3. 在RestController中获取各种信息的方法

    内容 获取方法 URL中路径的一部分 首先需要在RequestMapping做映射, 之后在方法中可以通过注解使用映射的变量@GetMapping("/{id}")public S ...

  4. [论文理解] FoveaBox: Beyond Anchor-based Object Detector

    FoveaBox: Beyond Anchor-based Object Detector Intro 本文是一篇one-stage anchor free的目标检测文章,大体检测思路为,网络分两路, ...

  5. echarts修改X,Y轴上的颜色

     分为2.0和3.0 一.2.0 修改的代码: x轴: xAxis : [ { type : 'category', data : ['<30','30-','40-','50-','60-', ...

  6. 代码实现:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

    package com.loaderman.test; import java.io.File; import java.io.FilenameFilter; public class Test { ...

  7. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  8. 机器学习之K-Mean聚类算法

    知识点: # coding = utf-8 import numpy as np import pandas as pd from sklearn.cluster import KMeans &quo ...

  9. Tomcat 8.5 配置自动从http跳转https

    1.需要修改Tomcat目录下的conf/server.xml文件两处地方,Http端口,从默认的8080改为80:Https端口从8443改为443:(80\443分别都是http/https默认端 ...

  10. 关于web技术的一些见解

    在目前的软件技术领域中,互联网方面的技术是其中最热门的一部分.现在做一个普通的网站,就涉及到大部分的web技术了:前端展示,后端数据处理,功能模块等.我觉得,也就分两个部分的技术:前端,后端. 前端, ...