用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。
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的话,代表成功完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2012-12-24 在VC中定制Doxygen注释宏
2012-12-24 Doxygen + Graphviz + Htmlhelp, 成为文档好手
2012-12-24 C++开发常用工具“群英会”