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兩個數字。

運行結果以下:

記錄完畢,歡迎指出不足!

相關文章
相關標籤/搜索