我已经在Win XP平台上用VS6.0开发了一个相当大的C++程序,现在已经迁移到一台运行Win7(仍然运行VS6.0)的新机器上。该代码包含一个实例化并运行CFileDialog对象的函数,用于从特定的初始目录查找并打开具有特定扩展名的ASCII码文件。但现在,程序挂在了线上
if (t1.DoModal()==IDOK)...where t1是CFileDialog实例。为了研究标准CfileDialog类停止工作的原因,我在VS6.0中创建了一个单独的测试项目,其中有一个带有一个按钮的简单对话框,其中包含以下代码:
void CFileDialogTestDlg::OnOpenFileDialogButton()
{
CFileDialog t1(true);
if(t1.DoModal()==IDOK)
{
CString s3=t1.GetPathName();
MessageBox(s3);
}
}这个测试运行良好,并显示一个可用的文件对话框。我还可以通过修改t1的m_ofn成员,在我的大型项目中复制我想要的初始目录等。
但是将这段代码放到我的大型项目中(即修改其中的相关按钮)仍然会挂在DoModal()行上。试图追溯到一个标准的MS类似乎是徒劳的,内部是不可能在合理的时间框架内理解的。
当我为我的测试项目增加堆栈空间以匹配我的大型项目(400MB)时,我重现了与大型项目相同的挂起行为。
有人能解释为什么增加堆栈空间会以这种方式影响文件对话框的执行吗?有没有办法绕过这个问题,记住我需要大的堆栈空间来避免完全重写我的项目?
发布于 2014-07-08 23:14:09
我不确定堆栈是你的问题。已经有一段时间了,但我似乎回想起如果你从错误的线程访问常见的情态语句时它们会挂起。
发布于 2014-07-09 07:19:01
使用PostMessage() API将命令从任何线程发送到拥有模式对话框的线程。它需要是拥有(和阻塞)线程,最终接收接受/取消对话的命令,以便它从其消息泵例程返回。
如果安装Windows调试符号,则可以在调试器中看到阻塞线程的完整调用堆栈。
https://stackoverflow.com/questions/24766704
复制相似问题