MFC多线程的建立使用

最近学习了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两个数字。

运行结果以下:

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

相关文章
相关标签/搜索