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
");
		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
");
		Sleep(1000);
	}	
}

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

运行结果如下:

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

原文地址:https://www.cnblogs.com/leo-lv/p/11417054.html