我有一个wxwindows应用程序,在一个按钮的onclick事件中,我有一个很长的过程,例如我有这样的东西:
for(int i=1;i<100;i++)
{
sleep(1000);
gaugeProgress->SetValue(i);
*textOutput<<i;
}
运行此代码可阻止UI响应。我添加
Refresh();
Update();
之后
*textOutput<<i;
但它不起作用。
有什么办法可以抽出活动吗?
我正在使用VS 20102在Windows上工作
答案 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事件一样处理消息堆栈。
但我认为正确的方法应该是使用线程。