最近學習了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兩個數字。
運行結果以下:
記錄完畢,歡迎指出不足!