【问题标题】:How do you call CMFCRibbonProgressBar methods from a different thread?如何从不同的线程调用 CMFCRibbonProgressBar 方法?
【发布时间】:2011-09-21 09:00:11
【问题描述】:

我有一个简单的 CMFCRibbonProgressBar 和一个线程,当长时间的操作进行时,它会调用 SetPos(value, TRUE)。 问题是在调试模式下它在 wincore.cpp 中断言:

    CHandleMap* pMap = afxMapHWND();
    ASSERT(pMap != NULL);

我从该文件中的 cmets 了解到,我不应该从不同的线程调用它,因为它可能存在潜在危险。 那么我的问题是你如何获得一个线程来更新进度条的位置? 我很想忽略那个断言并继续在发布模式下,但这很邪恶......

有什么建议吗?

【问题讨论】:

    标签: c++ multithreading mfc


    【解决方案1】:

    好的,有人对这个问题进行了非常简短的评论,他们给出了正确的答案。我不知道他们为什么撤回评论:/

    我最终在 CMFCRibbonProgressBar 派生类中存储了一个 CWnd* 指针,每当我从工作线程调用“SetAmountCompleted”方法时,我都会使用 CWnd 发送一条自定义消息,其中包含指向 WPARAM 中派生类的指针. 接收到消息的CWnd然后提取指针并调用Update方法,该方法将重绘进度条。

    它很复杂,很丑,它是 MFC。唷。

    【讨论】:

    • 不,它不是 MFC,它不丑。事实是,从与创建窗口不同的线程操作窗口是不行的。正确的策略是以某种方式将更新请求发送到 UI 线程(发布 WM_USER+x 是个好主意)并让处理程序弄清楚如何完成任务。无论如何,工作人员不应该知道您的 UI 的详细信息。
    • worker 对 UI 一无所知,它只获得一个指向 IProgressNotification 接口的指针,该接口具有 SetTotal 和 SetAmountCompleted。 CMFCRibbonProgressBar 派生类继承自它和所述功能区进度条。事实上,实际的工作线程位于一个单独的库中,它对 MFC 毫无了解。如您所见,问题在于这个派生类接收到通知然后更新 UI,这是 MFC 不喜欢的。相反,现在我必须使用 CWnd 参与一些肮脏的业务,这只会增加复杂性:/
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2013-11-09
    • 2012-04-25
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多