用户界面线程AfxBeginThread的使用

简介: 用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。 AfxBeginThread 函数原型如下: CWinThread *AfxBeginThread(     CRuntimeClass *pThreadClass,         //从CW...

用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。

AfxBeginThread 函数原型如下:

CWinThread *AfxBeginThread( 
    CRuntimeClass *pThreadClass,          //从CWinThread派生的RUNTIME_CLASS类   
     int   nPriority  /* = THREAD_PRIORITY_NORMAL */  ,       //指定线程的优先级   
    UINT nStackSize  /* = 0 */  ,                 //定义新线程的堆栈大小   
    DWORD dwCreateFlags  /* = 0 */  ,      //为控制线程创建的附加标志   
    LPSECURITY_ATTRIBUTES lpSecurityAttrs  /* = NULL */       //指定线程的安全属性   
)  

用户界面线程必须包含有消息循环,以便可以处理用户消息。要使用用户界面线程,必须派生自CWinThread 类一个线程类,而且一般要重写类的InitInstance ()和ExitInstance ()函数。

示例:编写一个应用程序,当用户在程序主窗口按下鼠标左键时,会启动一个用户界面线程。当用户在线程窗口界面按下鼠标左键时,会弹出一个信息框。
1.新建单文档程序;
2.单击菜单栏“项目”→“添加类”→“MFC类”,基类选择“CWinThread ",类名输入CMyThread,点”完成“,同时以类似步骤以CFrameWnd类为基类派生CMyWnd 类;
3.在视图类实现文件包含头文件:

#include    "MyThread.h"  

4.在CMyThread类实现文件中包含头文件:

#include    "MyWnd.h"  

5.在CMyThread::InitInstance()中创建线程中的窗体:

BOOL CMyThread::InitInstance() 

    CMyWnd *pFrameWnd =  new   CMyWnd(); 
    pFrameWnd->Create(NULL, _T( "Thread Windows"  )); 
    pFrameWnd->ShowWindow(SW_SHOW); 
    pFrameWnd->UpdateWindow(); 
     return   TRUE; 
}  

6.在CMyWnd类中修改构造函数CMyWnd() public 属性,然后实现鼠标左键消息响应函数:

void   CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) 

    LPTSTR pMessage = _T( "This is a window thread"  ); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(NULL, pMessage, _T( "Thread Message"  , MB_OK));  
    CFrameWnd::OnLButtonDown(nFlags, point); 
}  

7.在应用程序视图类中实现鼠标左键响应函数:

void   CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(RUNTIME_CLASS(CMyThread)); 
    CView::OnLButtonDown(nFlags, point); 
}  

程序运行结果:

这里要注意的是,这个用户界面不是属于主框架窗口的,可以说是和主线程窗口并列的。通过查看桌面任务栏就可以发现,两个窗口并行着显示,而且互相不影响。注意上面给出的代码MessageBox 是引用API的,并且是无窗口,所以这里有三个并行的窗口,而且各不干扰。单独关闭用户界面线程的窗体,可以正常退出用户界面线程。但是如果直接关闭了主线程窗体,那么用户界面线程就会非法关闭,造成内存泄露。

对于用户界面线程的正常退出,只要在用户界面线程内调用PostQuitMessage 即可,参数为0的话,代表成功完成。

目录
相关文章
|
21天前
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
102 3
|
8月前
|
缓存 Java 数据库连接
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
|
10月前
|
安全 Java 调度
【Java并发编程 五】线程生命周期及状态切换
【Java并发编程 五】线程生命周期及状态切换
60 0
|
消息中间件 负载均衡 算法
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
|
Java 调度
【多线程学习笔记3】线程的生命周期与控制
【多线程学习笔记3】线程的生命周期与控制
|
缓存 Java 调度
C#(四十一)之线程
线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。
159 0
C#(四十一)之线程
|
调度 C# Windows
WPF 线程:使用调度程序构建反应速度更快的应用程序
原文:WPF 线程:使用调度程序构建反应速度更快的应用程序 作者:Shawn Wildermuth 原文:http://msdn.
965 0