MFC 创建UI线程
对于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线程的更多相关文章
- [转]使用VC/MFC创建一个线程池
许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...
- 关于“UI线程”
http://www.cppblog.com/Streamlet/archive/2013/05/05/199999.html 缘起 这是一篇找喷的文章. 由于一些历史原因和人际渊源,周围同事谈论一些 ...
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- MFC创建线程示例
MFC创建线程示例 AfxBeginThread() 创建现场的方法是AfxBeginThread()函数. 在[.CPP]文件定义一个全局变量,决定什么时候退出这个线程. BOOL g_bWillE ...
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它
C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...
- 创建UI的线程才能访问UI,那么怎样才算访问UI呢
只有创建UI元素的线程(主线程又叫UI线程)才能访问UI元素.在UI线程中工作,不会有这个问题. 在后台线程中,如果直接访问UI元素,会抛出 “调用线程无法访问此对象,因为另一个线程拥有该对象” 异常 ...
- MFC在子线程中创建窗口(PostMessage方法)
1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...
- 模板应用--UI线程与worker线程同步 模仿c# invoke
由之前的一篇博文 <UI线程与worker线程><UI线程与worker线程>引出,UI线程与worker线程“串行化”在win32上实现是多么没有节操的事情,代码编写麻烦不说 ...
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
1.创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数.该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程. 工作者线程 CWinThread ...
随机推荐
- codeforces B. Coach 解题报告
题目链接:http://codeforces.com/problemset/problem/300/B 题目意思:给出n个students(n%3 = 0),编号依次为1-n,接下来有m行,每行有两个 ...
- 精选Java面试题(二)
Java中的方法覆盖重写(Overriding)和方法重载(Overloading)是什么意思? Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况.与此相对,方法 ...
- Java中的final和static
final final可以用在类.方法.变量上. 1.final用在类上,表明当前类它不能被继承,没有子类. 2.final用在方法上,表明当前方法不能被override,不能被重写. 3.final ...
- liunx下解压压缩命令详细介绍
Linux下的压缩解压缩命令详解及实例 实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip == ...
- cogs1070玻璃球游戏
1070. [焦作一中2012] 玻璃球游戏 ★ 输入文件:marbles.in 输出文件:marbles.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小x ...
- ubuntu 常见问题解决
1.更新出现Could not get lock /var/lib/apt/lists/lock问题解决方法: 首先输入命令:sudo rm /var/lib/apt/lists/* -vf 执行完成 ...
- 《Objective-C高级编程》の内存管理の学习笔记
此日志用于记录下学习过程中碰到的问题 转载请注明出处: http://www.cnblogs.com/xdxer/p/4069650.html <Objective-C高级编程> 人民邮电 ...
- Kafka入门之生产者消费者
一.Kafka安装与使用 ( kafka介绍 ) 1. 下载Kafka 官网 http://kafka.apache.org/ 以及各个版本的下载地址 http://archive.ap ...
- Flutter实战视频-移动电商-28.列表页_商品列表后台接口调试
28.列表页_商品列表后台接口调试 主要调试商品列表页的接口 这个接口是最难的因为有大类.小类还有上拉加载 先配置接口 config/service_url.dart //const serviceU ...
- Flutter实战视频-移动电商-55.购物车_底部结算栏UI制作
55.购物车_底部结算栏UI制作 主要做下面结算这一栏目 cart_bottom.dart页面 先设置下内边距 拆分成三个子元素 全选 因为有一个文本框和一个全选的text文本,所以这里也用了Row布 ...