假如有这样一种情况,我们在主线程写了一个死循环,当程序运行到主线程的死循环代码后界面便卡死点了没有反应,这里提供几种方法处理界面假死的情况,保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。
方法1:
把主程序中比较耗时的功能放入线程去执行,多线程用法可以参考《QT从基础到进阶·十九》QThread多线程使用
方法2:
主线程中耗时的地方加入QCoreApplication::processEvents(); 可以防止界面假死,在死循环期间可以继续执行主线程中的其他的事。
QTime time; time.start(); //从当前时间开始,time.elapsed() < 5000 延时5秒 int i = 0; while (time.elapsed() < 5000) //elapsed运行while循环做为开始时间延迟5秒结束循环 { QCoreApplication::processEvents(); //防止界面假死可以在死循环期间做其他事 qDebug() << "hello" << i++ << endl; _sleep(1000); } qDebug() << "stop" << endl;
方法3:
C++方式
while(true) { // 下面代码和QCoreApplication::processEvents()效果一样 MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
方法4:
QT事件循环防止界面假死:
QEventLoop eventloop; QTimer::singleShot(5000, &eventloop, SLOT(quit())); //5秒后退出事件循环 eventloop.exec();
这个放在按钮里如果快速点两次按钮,他会产生两个事件循环,5秒后会依次出来两次
点两次pushButton_2产生两个事件循环,点一次pushButton会把两个事件循环都触发结束
产生事件循环就算不触发结束,在关闭程序的时候也会自动触发结束,如果点了两次事件循环,关闭程序时int a = 0也会走两次。
注意:
在防止界面假死循环或者多线程中的死循环处理中一定要加入时间延迟,这样可以保证CPU不会被一直抢占,不然CPU利用率会一直很高。
还有一点要注意,比如点击按钮进入死循环,如果加了防止假死代码,界面可以动,如果再次点击按钮会再次进入死循环,这时候界面依旧可以动,但注意的是这时候是有两个死循环正在执行,需要退出两次才算真正的退出死循环。