我有一个基于MFC的遗留应用程序,我现在无法进行太多修改 .
有一个功能涉及从/向INI文件读取/写入数据 . 编写时要记住,ini文件中的设置数量会非常少 . 但现在它已经变得非常庞大 .
因此,在执行此任务时,大约需要30分钟 .
问题是当用户点击应用程序时,应用程序获取锁定并且窗口窗口显示它没有响应对话框,询问用户是否需要等待应用程序响应或退出 .
现在对我来说,我可以管理时间 . 但我不希望窗口显示“无响应”行为 .
我认为问题是,主线程忙于此过程并且UI挂起 . 我不确定这一点,因为我只是在猜测 .
为了处理这个,我创建了一个Thread并在其中调用此函数 . 但是在这个线程函数中我无法调用 AfxGetMainWnd();
函数,因为它返回 NULL
.
这将是非常有帮助的,如果有人请让我知道,如何处理这种情况(留下理想的情况不发生这种情况)?
也欢迎任何好的建议 .
我的另一个问题也是将这段代码放在进度条对话框上.----对此我们表示欢迎 .
谢谢
3 回答
这里解释了从工作线程向MFC主线程发布自定义消息(参见FAQ 12):
http://vcfaq.mvps.org/mfc/index.htm
您应该在工作线程中读取文件 . 如果您想要一个进度对话框,将其放在主线程中并向其发布消息以更新进度显示 .
在MFC应用程序中使用线程的技巧是要记住只有主线程才能访问所有GUI元素 . 因此,如果您分离一个线程来完成某些工作,您需要以某种方式将更新和修改传回主线程并让它进行GUI更新 .
最简单的方法是给自己发一条消息,消息泵在主线程上,所以它总是会收到消息 . 一旦你知道,它真的很简单 .
因此,创建一些WM_USER消息并在需要时从您的线程发送它们并正常处理它们 .
这是我为这种情况所做的黑客攻击 . 我主要创建基于对话框的应用程序,用于测试各种电子创作或处理数据等 . 简单的东西,但人们想做一些UI多任务处理,并保持简单 . 我添加这个功能:
并且在我正在做任何处理时定期调用它 . 每秒调用10X很好,但即使每秒一次也能提供良好的UI体验 . 另一个技巧:有一个带有处理程序的“取消”按钮,单击时将bool设置为true . (叫bool m_doCancel,比方说) . 现在,当您开始执行耗时的任务时,请执行以下操作:
现在做你的任务,经常调用doRepaints(),并在调用doRepaint()之后检查bool:
所以这样你就有办法让用户退出以及处理重绘等 .
FWIW!
Ĵ