【问题标题】:How to prevent a long process to hangs wxwidgets window如何防止长时间挂起wxwidgets窗口
【发布时间】:2014-12-01 20:14:36
【问题描述】:

我有一个wxwindows应用,在一个按钮的onclick事件中,我有一个很长的过程,比如我有这样的东西:

for(int i=1;i<100;i++)
{
    sleep(1000);
    gaugeProgress->SetValue(i);
      *textOutput<<i;
}

运行此代码,停止 UI 响应。我加了

Refresh();
Update();

紧接着

 *textOutput<<i;

但它不起作用。

有什么方法可以让我抽出事件?

我正在使用 VS 20102 在 Windows 上工作

【问题讨论】:

  • 创建一个新线程并在该线程中进行艰苦的工作。如果您需要指示进度或完成,您可以从该线程向主 UI 线程发送通知。同样,如果您想取消任务,您可以从主线程向新线程发送消息。周围有很多 tuts,我想有人涵盖了 wxWidgets 以及在使用该框架时如何执行此任务。 :)
  • @enhzflep 谢谢。线程之间如何通信? Boost有什么帮助吗?我记得在 MFC 中,有一个方法可以处理事件并阻止 wndows 挂起。 WxWidgets中有没有这样的方法?
  • 没问题。在普通的 win32 世界中,人们会使用SendMessagePostThreadMessage。我不使用 BOOST 并且在我的任何琐碎 wx 项目中都不需要线程。我想搜索“与 PostThreadMessage 等效的 wxWidgets”可能会得到有用的结果。这是结果之一,也许它有帮助:forums.wxwidgets.org/viewtopic.php?t=8392
  • @enhzflep:我发现 wxYield() 很有帮助。

标签: c++ visual-c++ wxwidgets


【解决方案1】:

你可以在你的 wxwindows 中添加一个 wxTimer 成员,在窗口构造函数中启动它,如下:

m_timer.Start(1000);

然后用函数捕获定时器事件,例如:

void mywindow::OnTimer(wxTimerEvent& event)
{
  Refresh();
  Update();
}

确保将事件连接到 wxTimer 成员。

【讨论】:

    【解决方案2】:

    在这些情况下,我会像这样使用 wxYield():

    for(int i = 1; i < 100; i++)
    {
      // sleep() freezes the program making it unresponsible.
      // sleep(1000);
      gaugeProgress->SetValue(i);
      *textOutput << i;
      // wxYield stops this function execution 
      // to process all the rest of stocked events 
      // including the paint event and resumes immediately.
      wxYield();
    }
    

    这会停止当前进程并让应用程序像绘制事件一样处理消息堆栈。

    但我认为正确的方法应该是使用线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多