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

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的话,代表成功完成。

用户界面线程AfxBeginThread的使用的更多相关文章

  1. VC++ 结束线程 AfxBeginThread AfxEndThread

    如果你的线程是从CWinThread继承出来的,结束自己就用AfxEndThread, 如果是外部调用的话,可以用PostThreadMessage(m_nThreadID, WM_QUIT,0,0) ...

  2. 工作线程AfxBeginThread的使用

    工作线程通常用来执行一些后台任务,如:数据计算.后台杀毒等等.因为不需要创建窗口和处理用户消息,编写比较容易,在程序中只要调用AfxBeginThread 函数就可以创建并启动一个工作线程了. Afx ...

  3. MFC启动和关闭线程

    1. 启动线程: CWinThread* AfxBeginThread( 线程函数,this ); 2.通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行.如果字处理器使用后台打印线程,若 ...

  4. 安全终止MFC线程

    终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...

  5. AfxBeginThread的介绍/基本用法

    AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...

  6. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  7. 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)

    1.创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数.该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程. 工作者线程 CWinThread ...

  8. MFC多线程各种线程用法 .

    http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleTh ...

  9. MFC 多线程及线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

随机推荐

  1. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  2. 数据解析之XML和JSON

    1. 解析的基本的概念 解析:从事先规定好的格式中提取数据 解析前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JOSN解析 2. X ...

  3. JQuery实现表格的相同单元格合并的三种方法

    代码: <!DOCTYPE html> <html> <head> <title>merge.html</title> <meta h ...

  4. C# 调用迅雷 7 迅雷下载开放引擎

    最近有个项目需要用winform调用迅雷下载.上网百度后发现迅雷自带的com组件从迅雷5之后就废掉了,除了能添加任务,其余功能全不能用.后来又发现了迅雷下载开放引擎这么个东西 http://thund ...

  5. iOS开发 日常错误积累

    1.ios7 tableviewcell上面加入一个view,view上面有button,点击button不运行button的点击事件 解决的方法: self.view.userInteraction ...

  6. 解决warning: incompatible implicit declaration of built-in function &#39;malloc&#39;

    因为代码中使用了malloc函数和字符串函数.编译时出现错误 warning: incompatible implicit declaration of built-in function 'mall ...

  7. 乐视(letv)网tkey破解

    乐视网tkey算法频繁变动,怎样才干获得她算法的源代码,以不变应万变? 本文仅仅用于技术交流.提醒各位尊重站点版权,请勿用于其他用途,否则后果自负! 使用软件 Adobe Flash Builder ...

  8. Failed to load the JNI shared library

    解决Eclipse无法打开"Failed to load the JNI shared library" 这是由于JDK配置错误所导致的现象. 一般说来,新购笔记本会预装64位的w ...

  9. ASP.NET路由

    ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL. 由于该 URL 不必映射到文件,因此可以使用对用户操作进行描述因而更易于被用户理解的 URL. ASP.NET MVC 框架和 A ...

  10. ThinkPHP - 自动创建 + 自动验证 + 自动完成

    自动创建:创建数据模型. $User->create(); 自动验证:验证提交的表单数据. protected $_validate = array( array('verify','requi ...