最近学习了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两个数字。
运行结果如下:
记录完毕,欢迎指出不足!