读书人

MFC 非方式对话框的销毁

发布时间: 2013-01-19 11:41:36 作者: rapoo

MFC 非模式对话框的销毁
我在线程中创建了一个非模式对话框,想在线程执行到最后的时候把这个非模式对话框给删掉,但是
inportDlg->DestroyWindow();时程序崩掉了。不知道什么原因。那位知道帮忙指点下。
[解决办法]
原因很多,大多数的情况是你的对话框销毁掉了,资源不存在了,可以你的线程什么的还在运行并访问,便出了异常
[解决办法]
delete inportDlg试试
[解决办法]
MSDN上有告诉你,非模态对话框如何销毁:
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.
[解决办法]
把你的代码亮出来大家帮你找原因啊
[解决办法]
inportDlg->DestroyWindow();
就不用放到线程里做了,该在主线程里做吧~
[解决办法]
放在其他线程里面销毁肯定有问题,楼主既然用了线程,应该知道多线程编程有个同步与互斥的问题,这个问题不但对普通数据有效,对窗口同样有效,所以应该在主线程中销毁。
当然,楼主希望实现线程退出的时候非模态对话框销毁也是有方法的,可以使用自定义消息的方式。看了楼主的程序,楼主在线程函数的结尾调用了一个PostMessage向inportSuccDlg窗口发送消息,那应该楼主也有响应该消息的程序了,这样的话,楼主可在那个响应程序那里调用inportDlg->DestroyWindow();然后delete
[解决办法]
像inportSuccDlg一样 发消息到主线程 主线程再delete就可以了 不用调DestroyWindow
[解决办法]

引用:
引用inportDlg是怎么传到现成里的
全局变量?
你这里用的好乱啊 我在全局定义。然后在调用线程的函数里边new个指针对象C/C++ code?123456789101112131415161718192021222324void CReadSDDlg::OnLoad() { if(LoadData()) { if (m_……
按着谁申请谁释放的原则
你不应该在线程里销毁这个对话框
MFC不保证这种操作是线程安全的
对于你现在这个代码状态在合理的方法是发个消息给这个对话框让他自己销毁自己
[解决办法]
inportDlg 好乱啊。你单步调试一下。看看是哪步有问题
[解决办法]
线程在结束的时候,发送一条自定义消息去对话框,让对话框自己结束
然后线程再结束
用线程操作UI,往往会出现意想不到的问题
还是发消息来的靠谱


void CYourDlg::CloseNotify(WMPARA wparam,LPARAM lparam)
{
this->PostMessage(WM_CLOSE,0,0);
}

读书人网 >VC/MFC

热点推荐