如何防止长进程挂起wxwidgets窗口

时间:2014-10-07 11:53:50

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

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

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

运行此代码可阻止UI响应。我添加

Refresh();
Update();

之后

 *textOutput<<i;

但它不起作用。

有什么办法可以抽出活动吗?

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

2 个答案:

答案 0 :(得分:0)

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

m_timer.Start(1000);

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

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

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

答案 1 :(得分:0)

在这些情况下,我使用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();
}

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

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