连续更新GUI表单元素,以便Form不会挂起

时间:2013-08-15 20:00:51

标签: c++ multithreading qt user-interface

正如标题所述,我试图通过线程不断更新GUI表单元素,但表单似乎仍然很忙。我无法理解。这就是我接近它的方式。

connect(this,SIGNAL(SIGUpdateForm),this,SLOT(MyUpdateMehtod));

现在每当需要更新表单时,我只需执行以下操作。我在新线程中启动一个方法。然后新线程触发上述信号。

boost::thread t(&SomeClass::SomeMethod(),this);

现在,一旦启动了someMethod,我就是这样做的

void SomeMethod()
{
      SIGUpdateForm(); //Launch the signal that will update the form
}

然后SIGUpdateForm调用MyUpdateMehtod(),因为信号(无论是排队还是直接都没有启动任何线程,因此表格似乎挂起了。)但这让我困惑,因为信号本身是从一个独立的线程调用的,为什么形式悬挂?我该怎么做才能使这项工作?

1 个答案:

答案 0 :(得分:1)

Qt有自己的主题。实际上你不需要一个线程。 QTimer将为您完成。这是一个例子。

void updateForm()
{
 ui->bla->setText("bla");
 // bla bla method
}

QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(updateForm()));
timer.start(3000);

现在updateForm()将每3秒调用一次。 GUI不会挂起。另一种方法是处理事件循环,

while(....)
{
 // some lengthy task
 qApp->processEvents(QEventLoop::AllEvents);
}