首页 > 编程语言 > 详细

使用AfxBeginThread创建界面线程

时间:2021-06-03 17:12:03      阅读:13      评论:0      收藏:0      [点我收藏+]

首先创建一个界面类,在界面类里面添加一个进度条做演示

 1 #pragma once
 2 #include <afxwin.h>
 3 class CMyWnd :
 4     public CFrameWnd
 5 {
 6 
 7 public:
 8     DECLARE_MESSAGE_MAP()
 9     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
10 private:
11     CProgressCtrl m_pos;
12 public:
13     afx_msg void OnTimer(UINT_PTR nIDEvent);
14     afx_msg void OnDestroy();
15 };

实现方法:

 1 #include "pch.h"
 2 #include "CMyWnd.h"
 3 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
 4     ON_WM_CREATE()
 5     ON_WM_TIMER()
 6     ON_WM_DESTROY()
 7 END_MESSAGE_MAP()
 8 
 9 
10 int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
11 {
12     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
13         return -1;
14 
15     // TODO:  在此添加您专用的创建代码
16 
17     m_pos.Create(WS_CHILD | WS_VISIBLE, CRect(10, 10, 300, 50), this, 10001);
18     m_pos.SetRange(0, 100);
19     m_pos.SetStep(1);
20     SetTimer(1, 100, 0);
21     return 0;
22 }
23 
24 
25 void CMyWnd::OnTimer(UINT_PTR nIDEvent)
26 {
27     // TODO: 在此添加消息处理程序代码和/或调用默认值
28     m_pos.StepIt();
29 
30     CFrameWnd::OnTimer(nIDEvent);
31 }
32 
33 
34 void CMyWnd::OnDestroy()
35 {
36     CFrameWnd::OnDestroy();
37 
38     // TODO: 在此处添加消息处理程序代码
39     KillTimer(1);
40 }

在窗口创建的时候,创建进度条窗口,并设置进度条信息

启动一个定时器,定时更新进度条的进度。添加清理虚函数,结束定时器

创建基于CWinThread的类

 1 #pragma once
 2 #include <afxwin.h>
 3 class MyThread :
 4     public CWinThread
 5 {
 6     DECLARE_DYNCREATE(MyThread)
 7 public:
 8     virtual BOOL InitInstance();
 9 protected:
10     DECLARE_MESSAGE_MAP();
11 };

注意:此类必须创建消息循环,否则将会导致AfxBegenThread函数内存不足。并且该类必须重写初始化函数。

实现方法:

 1 #include "pch.h"
 2 #include "MyThread.h"
 3 #include"CMyWnd.h"
 4 
 5 IMPLEMENT_DYNCREATE(MyThread, CWinThread);
 6 
 7 BOOL MyThread::InitInstance()
 8 {
 9 
10     CWinThread::InitInstance();
11     // TODO: 在此添加专用代码和/或调用基类
12     CMyWnd* Dlg = new CMyWnd();
13     Dlg->Create(NULL, "线程窗口");
14     Dlg->ShowWindow(SW_SHOW);
15     Dlg->UpdateWindow();
16 
17     return 1;
18 }
19 
20 BEGIN_MESSAGE_MAP(MyThread, CWinThread)
21 END_MESSAGE_MAP()

以上步骤做完后,就可以使用AfxBeginThread来创建界面线程了。

1 void CMFCApplicationDlg::OnBnClickedTest()
2 {
3     // TODO: 在此添加控件通知处理程序代码
4     AfxBeginThread(RUNTIME_CLASS(MyThread));
5 }

AfxBeginThread有两个版本,一个是界面线程版本,一个是工作线程版本。都是属于MFC的全局API。

其主要的理念就是:

通过基于CWinThread的类的 InitInstance()初始化函数来执行窗口对象。

通过全局API AfxBeginThread来创建线程。

 

使用AfxBeginThread创建界面线程

原文:https://www.cnblogs.com/Super-biscuits/p/14845243.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!