QApplication::processEvents的使用
关于QApplication::processEvents的使用
函数作用
函数解释
函数使用
函数作用
QApplication::processEvents 的作用是用于处理密集耗时的事情。
函数解释
对于执行耗时程序或函数时,QT需要等待程序执行完毕才能进行下一步,这个过程对于界面来说就是卡顿。当我们需要在执行这个耗时程序或函数时不断的刷新界面就可以使用QApplication::processEvents函数,一边执行程序一边刷新界面,就会给人一种很流畅的感觉。
函数使用
在程序执行耗时操作的地方加入QApplication::processEvents()函数即可。
————————————————
版权声明:本文为CSDN博主「一点一横长_t」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39526711/article/details/118198029
防止界面阻塞,很明确的一种方法就是再开一个线程。但有时也可以使用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()就不会返回了。其所在的循环代码就无法继续执行了。
————————————————
版权声明:本文为CSDN博主「Chirive」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Chirive/article/details/95106300
应用场景一:处理密集耗时的事情
有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕,程序不响应用户的任何操作,窗口也不会重新绘制,从而处于“无法响应”状态,这是一个非常糟糕的体验 。
在这种情况下,有一种方法是使用多线程,即在子线程中处理文件保存,主线程负责界面相关。
而如果不想使用多线程,最简单的办法就是在文件保存过程中频繁调用QApplication::processEvents()。该函数的作用是让程序处理那些还没有处理的事件,然后再把使用权返回给调用者。
-
bool MyApp::writeFile(const QString &filename)
-
{
-
QFile file(filename);
-
...
-
QApplication::setOverrideCursor(Qt::WaitCursor);
-
for(int r = 0; r != rowCount; ++r)
-
{
-
for(int c = 0; c != colCount; ++c)
-
{
-
out << table(r,c);
-
qApp.processEvents();
-
}
-
}
-
QApplication::restoreOverrideCursor();
-
}
应用场景二:非阻塞延时
-
QTime time;
-
time.start();
-
while(time.elapsed() < 1000) //等待时间流逝1秒钟
-
QCoreApplication::processEvents(); //不停地处理事件,让程序保持响应