首页 文章

Hanlding耗时的MFC操作

提问于
浏览
2

我有一个基于MFC的遗留应用程序,我现在无法进行太多修改 .

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

因此,在执行此任务时,大约需要30分钟 .

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

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

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

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

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

也欢迎任何好的建议 .

我的另一个问题也是将这段代码放在进度条对话框上.----对此我们表示欢迎 .

谢谢

3 回答

  • 2

    这里解释了从工作线程向MFC主线程发布自定义消息(参见FAQ 12):

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

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

  • 1

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

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

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

  • 0

    这是我为这种情况所做的黑客攻击 . 我主要创建基于对话框的应用程序,用于测试各种电子创作或处理数据等 . 简单的东西,但人们想做一些UI多任务处理,并保持简单 . 我添加这个功能:

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

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

    m_doCancel= false;
    

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

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

    所以这样你就有办法让用户退出以及处理重绘等 .
    FWIW!
    Ĵ

相关问题