MFC多线程编程的疑问!一般人解答不了!
在按钮的单击事件的响应函数中启动两个相同的线程,请看如下代码:
void CThreadtestDlg::OnBnClickedButton1()
{
AfxBeginThread(ThreadProc,m_hWnd,0,0,0,NULL); // L0
AfxBeginThread(ThreadProc,m_hWnd,0,0,0,NULL); // L1
TRACE("Main thread pWnd--- %d\n",this);
}
UINT ThreadProc(LPVOID lpParameter)
{
HWND hWnd = (HWND)lpParameter;
CThreadtestDlg* pWnd = (CThreadtestDlg*)(CWnd::FromHandle(hWnd));
TRACE("Work thread pWnd--- %d\n",pWnd);
CString str;
int i = 2000;
while(i) {
str.Format("%d",i);
SetWindowText(hWnd,str);
i--;
}
return 0;
}
第一个问题:
试问,为什么这样会阻塞主线程?
如果 注释掉 L1 只启动一个这样的线程,那么为什么不会阻塞?
第二个问题:
工作者线程中调用 FromHandle, 为什么不能得到和正确的窗口对象地址(TRACE的输出不一样)??
第三个问题:
如果改变行L2为 AfxBeginThread(ThreadProc2,this,0,0,0,NULL),直接传递MFC窗口对象指针,启动一个这样的线程:
UINT ThreadProc2(LPVOID lpParameter)
{
CThreadtestDlg* pWnd = (CThreadtestDlg*)lpParameter;
TRACE("Work thread 2 pWnd--- %d\n",pWnd);
CString str;
int i = 1000;
while(i)
{
str.Format("%d",i);
pWnd->SetWindowText(str);
i--;
}
return 0;
}
很多书上都说:一个线程只能访问它所创建的MFC对象!但这样的程序也能正常运行,为什么?
引MSDN:
To pass these objects from one thread to another, always send them as their native HANDLE type. Passing a C++ wrapper object from one thread to another will often result in unexpected results.
到底怎么样的MFC对象指针不能被在多线程间传递呢?
欢迎各位加入讨论,谢谢!
相关推荐
MFC多线程编程实例三个
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的多线程编程,结合提供的标题“MFC多线程编程实例三个”以及描述中的信息,我们将会了解到如何在MFC应用中实现多线程
MFC编程实践指南与练习解答
本文还有配套的精品资源,点击获取 简介:MFC是微软提供的C++库,用于简化Windows应用程序开发。本资源提供了MFC基本概念、文档/视图架构、应用程序框架、控件类、对话框类、文件处理类的实例代码和练习解答,旨在帮助初学者通过实例学习和实践,理解和掌握MFC的编程方法。通过编写代码和解决实际问题,学生将提升编程能力,并学会如何调试和解决MFC编程中的问题。 1...
VC++编程习题解答精要
C++语言继承了C语言的简洁高效,并在其中加入了面向对象的特性。它允许程序员通过类和对象来组织代码,支持多态、封装和继承三大面向对象的核心概念。MFC(Microsoft Foundation Classes)是一个为Windows应用程序提供界面和操作功能的C++类库。MFC抽象了Windows API的许多复杂性,使得开发者可以利用面向对象的编程思想来构建Windows应用程序。MFC类库将应用程序的逻辑部分和界面部分抽象成不同的类和对象,这样的设计不仅增强了代码的可重用性,还提高了开发效率。
MFC多线程编程实例
该项目基于MFC框架实现多线程编程,核心功能是在对话框界面上通过按钮控制线程的启停。线程函数负责更新进度条并动态修改窗口图标与标题,支持线程参数传递与UI同步。代码结构清晰,包含完整的线程管理和界面交
VS2013写的MFC多线程多串口编程,多串口可同时工作
总结来说,VS2013的MFC多线程多串口编程涉及了Windows API的使用,通过多线程实现串口通信的并发处理,确保多个串口可以同时工作且互不干扰。


进程/线程/DLL
