最近学习了MFC多线程的使用,多线程
写了一个继承CWinThread类的类MyThread;函数
在头文件开头用#define定义一个线程函数入口地址(会在下面定义代码中写出)学习
在类的开头加上IMPLEMENT_DYNCREATE(MyThread, CWinThread)spa
继承的子类里面必须重写两个函数.net
1、virtual BOOL InitInstance();
2、virtual int ExitInstance();线程
声明一个线程函数,函数名自定,个人类中的线程函数叫StartThread指针
在声明完线程函数后再声明DECLARE_MESSAGE_MAP(),该函数包含了消息映射必要的函数,声明了它就至关于在类内声明了这些提供消息映射必要的函数。code
头文件中类定义以下:对象
#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)blog
这样作的意图在于使能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两个数字。
运行结果以下:
记录完毕,欢迎指出不足!