MFC多线程编码--用户界面线程(四)
来源:互联网 发布:百合网数据库 编辑:程序博客网 时间:2024/05/20 03:08
下面以一个实例来介绍用户界面多线程编程。
建立一个基于对话框的工程 MultiThreadTest,在对话框 IDD_MultiThreadTest_DIALOG 中加入一个按钮 IDC_UI_THREAD,标题为“用户界面线程”。右击工程并选中“New Class…”为工程添加基类为 CWinThread 派生线程类 CUIThread。给工程添加新对话框 IDD_UITHREADDLG,标题为“线程对话框”。为对话框 IDD_UITHREADDLG 创建一个基于 CDialog 的类 CUIThreadDlg。使用 ClassWizard为 CUIThreadDlg 类添加 WM_LBUTTONDOWN 消息的处理函数 OnLButtonDown如下:
void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point) {AfxMessageBox("我是线程对话框发出的消息");CDialog::OnLButtonDown(nFlags, point);}
在 CUIThread.h 中添加
#include "CUIThreadDlg.h"
并在 CUIThread 类中添加 protected 变量 CUIThreadlg m_dlg:
CUIThread类的头文件如下:
#include "CUIThreadDlg.h"// CUIThread threadclass CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)// Attributespublic:// Operationspublic:CUIThread(); // constructor used by dynamic creation// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CUIThread();CUIThreadDlg m_dlg;// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};
分别重载 InitInstance()函数和 ExitInstance()函数:
BOOL CUIThread::InitInstance(){// TODO: perform and per-thread initialization herem_dlg.Create(IDD_UITHREADDLG);m_dlg.ShowWindow(SW_SHOW);m_pMainWnd = &m_dlg;return TRUE;}int CUIThread::ExitInstance(){// TODO: perform any per-thread cleanup herem_dlg.DestroyWindow();return CWinThread::ExitInstance();}
为避免内存泄露,在CUIThreadDlg 添加WM_DESTROY消息处理函数:
void CUIThreadDlg::OnDestroy() {CDialog::OnDestroy();delete this;}双击按钮 IDC_UI_THREAD,添加消息响应函数:
void CMultiThreadTestDlg::OnBtnUithread() {CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CUIThread));}
注意:要把 UIThread.h 中类 CUIThread()的构造函数的特性由 protected 改为 public。
用户界面线程的执行次序与应用程序主线程相同,首先调用用户界面线程类的InitInstance() 函数,如果返回 TRUE,继续调用线程的 Run()函数,该函数的作用是运行一个标准的消息循环,并且当收到 WM_QUIT 消息后中断,在消息循环过程中,Run()函数检测到线程空闲时(没有消息),也将调用 OnIdle() 函数,最后 Run() 函数返回, MFC 调用ExitInstance()函数清理资源。
你可以创建一个没有界面而有消息循环的线程,例如:你可以从 CWinThread 派生一个新类,在 InitInstance 函数中完成某项任务并返回 FALSE,这表示仅执行 InitInstance 函数中的任务而不执行消息循环,你可以通过这种方法,完成一个工作者线程的功能。
工程案例代码下载:MFC用户界面多线程工程案例
- MFC多线程编码--用户界面线程(四)
- MFC 多线程 用户界面线程创建
- MFC多线程之用户界面线程
- VS2010/MFC入门编程十七(多线程的创建,包括工作线程和用户界面线程)
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC用户界面线程
- MFC创建用户界面线程
- MFC创建用户界面线程
- 多线程-----创建用户界面线程
- MFC用户界面多线程实例2
- HDU 2544 最短路 【Dijkstra算法】
- 为大家编写一个数据可视化的软件
- docker use case
- EnhanceIO SSD Caching
- NOJ1103&next_permutation()
- MFC多线程编码--用户界面线程(四)
- 字节序与大小端
- 判断是否为64位机
- 穿越麦田的小路
- LBS预案作战指挥系统应用
- 设计模式——备忘录模式
- OpenCV的java绑定显示图片
- C/C++常用预定宏
- socket编程 实现服务端与客户端的通讯