2

我有一个基于 MFC 的遗留应用程序,到目前为止我无法对其进行太多修改。

有一项功能涉及从/向 INI 文件读取/写入数据。编写时要牢记 ini 文件中的设置数量将非常少。但现在它已经变得非常庞大。

所以在执行这个任务时,大约需要 30 分钟。

问题是当用户点击应用程序时,应用程序被锁定并且窗口窗口显示它没有响应对话框,询问用户是否需要等待应用程序响应或退出。

现在对我来说,我可以管理时间。但我不希望窗口显示“不响应”行为。

我认为问题是,主线程在这个过程中很忙,并且 UI 挂起。我不确定这一点,因为我只是猜测。

为了处理这个问题,我创建了一个线程并在其中调用这个函数。但是在这个线程函数中,我无法调用该AfxGetMainWnd();函数,因为它正在返回NULL.

如果有人请让我知道,如何处理这种情况(留下不发生这种情况的理想情况),这将非常有帮助?

也欢迎任何好的建议。

我的另一个想法也是将此代码放在进度条对话框中。---- 欢迎对此进行思考。

谢谢

4

3 回答 3

2

在 MFC 应用程序中使用线程的技巧是记住只有主线程可以访问所有的 GUI 元素。所以,如果你分离一个线程来做一些工作,你需要以某种方式将更新和修改传回主线程,并让它进行 GUI 更新。

最简单的方法是给自己发送一条消息,消息泵在主线程上,所以它总是会接收消息。它真的很简单,一旦你知道了。

因此,创建一些 WM_USER 消息并在需要时从您的线程发送它们并正常处理它们。

于 2013-08-11T12:28:00.967 回答
1

此处解释了从工作线程向 MFC 主线程发布自定义消息(请参阅常见问题解答 12):

http://vcfaq.mvps.org/mfc/index.htm

您应该在工作线程中读取文件。如果您想要一个进度对话框,请将其放在主线程中并向其发布消息以更新进度显示。

于 2013-08-11T14:40:13.803 回答
0

这是我为这种情况所做的一个黑客技巧。我主要创建基于对话的应用程序来测试各种电气创作或处理数据等。简单的东西,但想要做某种 UI 多任务处理并保持简单。我添加了这个功能:

void CWhateverApp::doRepaints(void)
    {
        MSG msg;
        while (PeekMessage(&msg,NULL,0,0xFFFFFFFF,PM_REMOVE))
        DispatchMessage(&msg);
    }

并在我进行任何处理时定期调用它。将其称为每秒 10 倍很好,但即使每秒一次也能提供不错的 UI 体验。另一个技巧:有一个带有处理程序的“取消”按钮,该处理程序在单击时将 bool 设置为 true。(比如说,调用 bool m_doCancel)。现在,当您开始耗时的任务时,请执行以下操作:

m_doCancel= false;

现在做你的任务,经常调用 doRepaints(),在调用 doRepaint() 之后检查 bool:

if (m_doCancel == true) { /* stop processing */ }

所以这样你就有了一种方法让用户退出以及处理重绘等。
FWIW!
Ĵ

于 2016-09-16T22:11:11.257 回答