防止界面阻塞,很明确的一种方法就是再开一个线程。但有时也可以使用processEvent()。
QProcessEvent()的作用是使程序进入消息循环,处理其他事件。可以用在需要执行很长时间的界面对象成员的循环中,在里面加一句processEvent()使界面不会出现卡死状态。
例子里实现按钮后页面等待2秒钟后弹出文字
void HelloQt::delaymsecNoBlock()
{
int msec = 2000;
QTime dieTime = QTime::currentTime().addMSecs(msec);
//QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
while (QTime::currentTime() < dieTime)
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
//QApplication::restoreOverrideCursor();
ui.label_3->setText("Time out");
// "In BlockTime" << std::endl;
}
运行过程中界面不会卡死
QTime startTime = QTime::currentTime();
qDebug() << "startTime:" << startTime << endl;
qDebug() << "smesc:" << startTime.msecsSinceStartOfDay() << endl;
int m = 0;
for (int i = 1; i < 100000; i++)
{
//m += i;
ui.progressBar->setValue(i);
//QCoreApplication::processEvents();
}
QTime dieTime = QTime::currentTime();
qDebug() << "dieTime:" << dieTime << endl;
qDebug() << "dmesc:" << dieTime.msecsSinceStartOfDay() << endl;
qDebug() << "time diff is " << dieTime.msecsSinceStartOfDay() - startTime.msecsSinceStartOfDay() << endl;
另外对比了一下调用processEvents和不调用的时间,调用时执行简单更新进度条100000次耗时5800ms,不调用时耗时4300ms,慢了1500ms左右。
而且发现,当只做累加计算时,即:
int m = 0;
for (int i = 1; i < 100000; i++)
{
m += i;
}
耗时0ms。
--------------------------------------------------------------
第二天更新:
今天发现使用processEvent()后,如果一直触发其他的事件(比如在标题栏中按住鼠标左键),processEvent()就不会返回了。其所在的循环代码就无法继续执行了。