MFC多线程的创建使用
最近学习了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两个数字。
运行结果如下:

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

浙公网安备 33010602011771号