用户界面线程AfxBeginThread的使用
用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。
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.在视图类实现文件包含头文件:
4.在CMyThread类实现文件中包含头文件:
5.在CMyThread::InitInstance()中创建线程中的窗体:
{
CMyWnd *pFrameWnd = new CMyWnd();
pFrameWnd->Create(NULL, _T("Thread Windows" ));
pFrameWnd->ShowWindow(SW_SHOW);
pFrameWnd->UpdateWindow();
return TRUE;
}
6.在CMyWnd类中修改构造函数CMyWnd() 为public 属性,然后实现鼠标左键消息响应函数:
{
LPTSTR pMessage = _T("This is a window thread" );
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(NULL, pMessage, _T("Thread Message" , MB_OK));
CFrameWnd::OnLButtonDown(nFlags, point);
}
7.在应用程序视图类中实现鼠标左键响应函数:
{
AfxBeginThread(RUNTIME_CLASS(CMyThread));
CView::OnLButtonDown(nFlags, point);
}
程序运行结果:
这里要注意的是,这个用户界面不是属于主框架窗口的,可以说是和主线程窗口并列的。通过查看桌面任务栏就可以发现,两个窗口并行着显示,而且互相不影响。注意上面给出的代码MessageBox 是引用API的,并且是无窗口,所以这里有三个并行的窗口,而且各不干扰。单独关闭用户界面线程的窗体,可以正常退出用户界面线程。但是如果直接关闭了主线程窗体,那么用户界面线程就会非法关闭,造成内存泄露。
对于用户界面线程的正常退出,只要在用户界面线程内调用PostQuitMessage 即可,参数为0的话,代表成功完成。
用户界面线程AfxBeginThread的使用的更多相关文章
- VC++ 结束线程 AfxBeginThread AfxEndThread
如果你的线程是从CWinThread继承出来的,结束自己就用AfxEndThread, 如果是外部调用的话,可以用PostThreadMessage(m_nThreadID, WM_QUIT,0,0) ...
- 工作线程AfxBeginThread的使用
工作线程通常用来执行一些后台任务,如:数据计算.后台杀毒等等.因为不需要创建窗口和处理用户消息,编写比较容易,在程序中只要调用AfxBeginThread 函数就可以创建并启动一个工作线程了. Afx ...
- MFC启动和关闭线程
1. 启动线程: CWinThread* AfxBeginThread( 线程函数,this ); 2.通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行.如果字处理器使用后台打印线程,若 ...
- 安全终止MFC线程
终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...
- AfxBeginThread的介绍/基本用法
AfxBeginThread 用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
1.创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数.该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程. 工作者线程 CWinThread ...
- MFC多线程各种线程用法 .
http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleTh ...
- MFC 多线程及线程同步
一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...
随机推荐
- MVC项目中如何判断用户是在用什么设备进行访问
使用UAParser在C#MVC项目中如何判断用户是在用什么设备进行访问(手机,平板还是普通的电脑) 现在我们开发的很多web应用都要支持手机等移动设备.为了让手机用户能有更加好的用户体验,我们经常为 ...
- Sublime Text 高级正则查换替换功能
有一个需求:把某从mysql 里导出的的数据表 数据里的 Insert语句 转换成 update 语句. 须要把例如以下的语句: insert into `table` (`ID`, `code`, ...
- BZOJ AC300题留念
- js默认行为(也称默认事件)
对应于智能社21课, 在浏览器的空白页面右击时会出现一个提示框,实际上这是用的document.oncontextmenu属性,如果用下面的代码就能够阻止这样的默认行为: <!DOCTYPE h ...
- 深入探究VC —— 链接器link.exe(4)
在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...
- 正则表达式验证数字、汉字、电话号码,email,整数,浮点数
验证数字的正则表达式集 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0- ...
- 查看电脑已安装的Jdk的位数
查看自己电脑已安装的Jdk的位数的方法: public class ShowJdkBit { public static void main(String[] args) { String arch ...
- muduo 与 libevent2 吞吐量对照
libevent 是一款很好用的 C 语言网络库,它也採用 Reactor 模型,正好能够与 muduo 做一对照. 本文用 ping pong 測试来对照 muduo 和 libevent2 的吞吐 ...
- [转]VMware 出现下述错误: Application failure. hr=0x80040101:Failed to initialize virtual machine.
VMware 出现下述错误:Application failure. hr=0x80040101:Failed to initialize virtual machine. 解决方法:1.重新注册这三 ...
- zoj3713 7Bit
意思是把一行字符串的长度按照找7位一个字节输出,如果长度能够存在7位里,字节的最高位置0,否则只输出7位并且输出字节的最高位置1,直到全部输出长度. 要注意的是有空串要输出00,其他按照16进制输出就 ...