【问题标题】:Display progress indicator in another thread using wxWidgets使用 wxWidgets 在另一个线程中显示进度指示器
【发布时间】:2017-08-29 20:26:37
【问题描述】:

我想知道是否有可能创建一个在主线程中正在进行操作时不会冻结的动画进度指示器。我认为也许创建第二个线程并使用它来显示一个简单的对话框(在这种情况下为wxGenericProgressDialog)可以解决问题。我尝试了多种方法来做到这一点,但都失败了。有一个简单的例子:

class ThreadTester : public wxThread {
public:
    ThreadTester(wxMutex *mutex, wxCondition *condition)
    {
        m_mutex = mutex;
        m_condition = condition;
    }

    virtual wxThread::ExitCode Entry() override {

        // This is usually non-blocking operation - this window
        // is by default non-modal
        d = new wxGenericProgressDialog("test1", "test2", 100, 0);

        wxMutexLocker lock(*m_mutex);
        m_condition->Broadcast();

        return nullptr;
    }

private:
    wxCondition *m_condition;
    wxMutex *m_mutex;

    wxGenericProgressDialog *d;
};

void MyFrame::PerformSomeTimeConsumingOperation(wxCommandEvent& event)
{

    wxMutex mutex;
    wxCondition condition(mutex);

    mutex.Lock();

    auto t = new ThreadTester(&mutex, &condition);
    t->Run();

    // Wait until showing dialog is completed
    condition.Wait();

    // Perform some time-consuming operation here

    // Kill thread (and hide the dialog) after the operation is completed
    t->Kill();

}

当我删除那行时

d = new wxGenericProgressDialog("test1", "test2", 100, 0);

它会工作得很好。这就是为什么我开始认为使用 wxWidgets(甚至没有父级)创建任何对话框都需要主线程的某种关注。这就是为什么当主线程被阻塞时无法在任何其他线程中创建对话框的原因。那是对的吗?有没有人实现了我想做的事情?我知道这样做的推荐方法是将耗时的操作移到另一个线程并将 gui 处理放在主线程中,但由于这需要重新设计我的应用程序的某些部分,我决定试一试先这样。

【问题讨论】:

    标签: c++ multithreading wxwidgets


    【解决方案1】:

    您应该切换方法 - 在辅助线程上执行长时间运行的任务并在主线程中执行 GUI 更新/刷新。

    您对问题的看法是错误的 - 明确存在线程来解决这个问题 - 在主线程运行时执行长时间运行的任务。

    此外 - 你的方法不能保证在 wxWidgets 支持的 3 个主要平台中的任何一个上工作。

    底线 - 在线程中执行任务并发送通知事件以更新主要事件 - GUI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2020-02-10
      • 2020-07-14
      相关资源
      最近更新 更多