对于windows来说,所有的线程都是一样的,但MFC却把线程区分为两种:用户界面(UI)线程和工作者线程。用户界面线程具有消息循环而工作者线程没有。UI线程可以创建窗口并给这些窗口发送消息,工作者线程执行后台任务,因其不接受用户直接输入蘑菇不需要窗口和消息循环。

创建UI线程需要首先从CWinThread派生一个线程类,改类与CWinApp类派生额应用程序类很相似(CwinApp继承自CWinThread)。派生类必须重载InitInstance,在其中创建一个对话框。关于对话框的创建可以参见上博文MFC中的模态对话框与非模态对话框.

首先在MFC类向导中添加继承自CWinThread的一个线程类CUIThread。

重载InitInstance如下(此处创建模态对话框):

BOOL CUIThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
MyDialog mydlg;
m_pMainWnd = &mydlg;
mydlg.DoModal();
return TRUE;
}

其中m_pMainWnd= &mydlg;是指定线程主窗口,m_pMainWnd的作用MSDN的解释如下:

The Microsoft Foundation Class Library will automaticallyterminate your thread when the window referred to by m_pMainWnd isclosed. If this thread is the primary thread for an application, theapplication will also be terminated. If this data member is NULL,the main window for the application's CWinApp object will beused to determine when to terminate the thread. m_pMainWnd isa public variable of type CWnd*.

Typically, you set this member variable when you override InitInstance.In a worker thread, the value of this data member is inherited from its parentthread.

也就是说当和m_pMainWnd相关的窗口被关闭后,MFC会自动终止你的线程。
接着在主对话框中添加按钮响应函数用于调用AfxBeginThread。

void CModalUIDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
CWinThread* pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread)); }

函数AfxBeginThread可用于创建工作者线程和UI线程,他们的调用方式不同,对于工作者线程:

CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,//线程回调函数
LPVOID pParam, //传递给回调函数的参数
int nPriority = THREAD_PRIORITY_NORMAL,//线程优先级
UINT nStackSize = ,//指定堆栈大小
DWORD dwCreateFlags = ,//创建表示(CREATE_SUSPENDED:挂起,0:立即执行)
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL //安全属性
);

对于UI线程:

CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,//CWinThread派生的RUNTIME_CLASS类
int nPriority = THREAD_PRIORITY_NORMAL,//线程优先级
UINT nStackSize = ,//指定堆栈大小
DWORD dwCreateFlags = ,//创建表示(CREATE_SUSPENDED:挂起,0:立即执行)
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL //安全属性
);

对应于之前讨论的模态与非模态对话框,这里也分别实现使用UI线程创建者两类对话框。

源码下载

参考:

[1]http://blog.csdn.net/cbnotes/article/details/8465212

[2]https://msdn.microsoft.com/en-us/library/f3ddxzww.aspx

MFC 创建UI线程的更多相关文章

  1. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  2. 关于“UI线程”

    http://www.cppblog.com/Streamlet/archive/2013/05/05/199999.html 缘起 这是一篇找喷的文章. 由于一些历史原因和人际渊源,周围同事谈论一些 ...

  3. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析

    winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...

  4. MFC创建线程示例

    MFC创建线程示例 AfxBeginThread() 创建现场的方法是AfxBeginThread()函数. 在[.CPP]文件定义一个全局变量,决定什么时候退出这个线程. BOOL g_bWillE ...

  5. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...

  6. 创建UI的线程才能访问UI,那么怎样才算访问UI呢

    只有创建UI元素的线程(主线程又叫UI线程)才能访问UI元素.在UI线程中工作,不会有这个问题. 在后台线程中,如果直接访问UI元素,会抛出 “调用线程无法访问此对象,因为另一个线程拥有该对象” 异常 ...

  7. MFC在子线程中创建窗口(PostMessage方法)

    1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...

  8. 模板应用--UI线程与worker线程同步 模仿c# invoke

    由之前的一篇博文 <UI线程与worker线程><UI线程与worker线程>引出,UI线程与worker线程“串行化”在win32上实现是多么没有节操的事情,代码编写麻烦不说 ...

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

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

随机推荐

  1. SPOJ Find the max XOR value(二进制,贪心即可)

    You have two integers L and R, and you are required to find the max xor value of a and b where L < ...

  2. 基于aspectj实现AOP操作的两种方式——xml配置

    1. 要导入的 jar 包: 常用的aspectj表达式: 权限修饰符可以省略,以下表示:返回值类型为任意,com.chy.service包以及其子包下的.任意类的.参数任意的.任意方法 execut ...

  3. bzoj4521

    数位dp 复习数位dp 数位dp一般用记忆化搜索来解决 观察需要满足的条件,然后计入状态 状态还要记录是否达到上线,以及前导零 比如说这道题 dfs(bit,a4,a8,cnt,last,limit) ...

  4. Java中的双重检查(Double-Check)详解

    在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...

  5. Ubuntu无法访问Windows磁盘, 且无提示信息

    现象描述, 双系统Ubuntu和Windows, 进入Ubuntu后无法访问Windows盘内容, 且图标闪烁无任何错误信息提示. 1.安装ntfsfix sudo apt-get install n ...

  6. mysql : mysql 5.6.13 免安装版配置

    前言:真正用到mysql是在公司的第二个项目下,具体的一些在之前的博客文章(http://www.cnblogs.com/zhengzeze/p/5623440.html)中也提到了,其中涉及到,免安 ...

  7. nohup、&、tail 在服务启动中的用法

    在利用命令行启动各类服务的时候,控制台一般会显示相关日志信息,如果weblogic的启动,我们可能有这样需求:启动服务器后即使关闭控制服务器依然运行 ,日志不但可以在控制台显示同时也记录里后台日志文件 ...

  8. E - Lovely Palindromes

    Description Pari has a friend who loves palindrome numbers. A palindrome number is a number that rea ...

  9. 6、html的body内标签之超链接

    一.超链接 <a href="https://www.baidu.com" target="_blank">某度</a> #target ...

  10. c语言中的# ## 可变参数宏 ...和_ _VA_ARGS_ _

    1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串.例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字 ...