VC、MFC对话框程序使用了多线程,在线程里面创建对话框指针导致对话框最小化卡死。怎么解决?

在线程里面用了CCOOKDlg *DlgPtr=(CCOOKDlg*)pParam;
COM1.Create(NULL,0,CRect(0,0,0,0),DlgPtr,IDC_MSCOMM1);
在保留这个指针前提下,如何解决问题,让最小化最大化能正常工作?

在线程里面用了CCOOKDlg *DlgPtr=(CCOOKDlg*)pParam;
这不是创建对话框,只是传递指针!
应该是通讯类对话框程序吧,这个注意两点,一个是com通讯要在主线程创建完毕,再抛出线程,线程直接使用已存在实例(而不是在线程create);一个是,可以通过DlgPtr->IsIconic来判断对话框状态,如果是最小化状态,则跳过界面更新。追问

我是说创建了对话框的指针,是我用语不对,是传递。通讯的建立我是放在线程里面的,一共两个线程都要进行串口通讯。奇怪的是,在接收数据时,如果我在前面AfxmessageBox一下就能接到数据,不然接收不到。是不是弹窗一下就是刷新了一次?因为我也是用AfxmessageBox来显示接收到的数据的。但是接收数据后nEvent = COM1.GetCommEvent();nEvent 仍然是2,都已经读了数据了怎么还会说缓冲区有数据(2表示有数据)?

追答

应该不是刷新,是延时了一下吧。接收应该是一个循环吧

追问

是一个while(1)我用了sleep(),但是如果不用AfxmessageBox的话,后面还是接收不到数据,反正是没有运行到显示数据的地方。接收到的数据我也是用AfxmessageBox显示的。是怎么回事啊?

追答

呵呵,这样猜不出来

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-19
大概是这样的。
vc中在线程里面直接对原类中一些操作时很危险的。像这样直接CREATE可能就会出问题。
正确的操作方法是,用消息。比如说到这一个地方要CREATE了,你自定义一个消息,在消息里面做CREATE等操作。
第2个回答  2013-03-19
创建对话框都放到主界面线程里,工作线程里不要创建对话框。

mfc多线程中弹出对话框的问题
是因为你的两个线程没有同步造成的,原因分析如下:主线程(有main的线程)在执行了所有代码后return返回。由于主线程返回,在main函数外部的C运行时库会调用ExitProcess来使进程退出。因此如果主线程返回了,意味着所有其它线程都会因为ExitProcess而被迫终止。由于创建模态对话框的线程是非正常终止,有它构建...

我用mfc多线程新建对话框,对话框只是闪一下就消失了,该线程就结束了,不...
或,变量dlg要为全局变量 你程序中的是局部变量,生存期showwindow后就结束了

VC中MFC创建了多线程,界面怎么还会有卡死现象,但程序在正确执行(可以执 ...
主线程的Sleep时间太长了

VC 创建多线程的问题
当你创建线程时候,可以给线程函数传递一个参数,这个参数你可以把对话框的指针传进去(也就是 this 指针)。当线程完成前,在线程函数里调用这个 对话框指针,进行操作就好。还有就是你对话框的 button不要用默认按钮,你要新拖个按钮来弄。对话框创建时自带的2个按钮(‘确定’,‘取消’),都有默...

MFC一个对话框通过指针访问另一个对话框的函数会指针失效是为什么?_百度...
确保已经正确地初始化了指针。可以使用CFileDialog::DoModal()或CFileDialog::Create()等函数来创建或显示对话框,并将返回的指针存储起来供以后使用。使用正确的指针类型来访问对话框成员函数,避免类型不匹配导致的错误。如果需要在多线程环境中访问对话框指针,请使用互斥锁或其他同步机制确保线程安全。

mfc创建一个死循环线程时。对话框会被占用。刚点到对话框编辑控件上...
因为如果工作和界面合用同一个线程的话,一个函数(例如上面的某个事件处理程序)工作量很大,很长时间都运行不完的话会一直占用界面线程,界面会一直是卡死的,不能操作,自然也就没法点击第二个按钮。

如何在MFC程序运行中自动弹出对话框并关闭
一、问题的提出 编写一个耗时的单线程程序:新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond(){ Sleep(6000); \/\/延时6秒 } 编译并...

我使用vs2005编译MFC程序,在多线程中创建CSocket类,每当使用Create方法...
CSocket类不稳定,经常出错,建议你直接使用Windows API的SOCKET套接字

mfc程序的界面上控件太多,导致一段时间系统死掉
如果没有其它处理,即使同时显示100个控件也不会造成假死现象。如果界面显示中,需要处理的逻辑和控制太多,可以考虑使用UI界面线程来处理窗口或对话框界面,那么就没有程序半天没反应的情况了。当然,如果机器硬件太差或者系统垃圾过多,那么任何一个界面都可能假死,这个和程序无关。

MFC 多文档程序,某个命令函数执行计算量大的功能时,界面卡在。
使用线程,最简单的办法就是添加 WM_TIMER事件,然后启动它,或者采用其他办法,线程很简单的,使用createthread或者_beginthread或者afxbeginthread,传一个参数进去,就是一个函数名,你要的功能写在你面,在里面更新进度条就可以了,不会

相似回答