• 《QT从基础到进阶·二十五》界面假死处理


    假如有这样一种情况,我们在主线程写了一个死循环,当程序运行到主线程的死循环代码后界面便卡死点了没有反应,这里提供几种方法处理界面假死的情况,保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。

    方法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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法3:
    C++方式

    while(true)
    {
        // 下面代码和QCoreApplication::processEvents()效果一样
    	MSG msg;
    	while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法4:
    QT事件循环防止界面假死:

    QEventLoop eventloop;
    QTimer::singleShot(5000, &eventloop, SLOT(quit())); //5秒后退出事件循环
    eventloop.exec();
    
    • 1
    • 2
    • 3

    这个放在按钮里如果快速点两次按钮,他会产生两个事件循环,5秒后会依次出来两次
    在这里插入图片描述
    点两次pushButton_2产生两个事件循环,点一次pushButton会把两个事件循环都触发结束
    产生事件循环就算不触发结束,在关闭程序的时候也会自动触发结束,如果点了两次事件循环,关闭程序时int a = 0也会走两次。

    注意:
    在防止界面假死循环或者多线程中的死循环处理中一定要加入时间延迟,这样可以保证CPU不会被一直抢占,不然CPU利用率会一直很高。
    还有一点要注意,比如点击按钮进入死循环,如果加了防止假死代码,界面可以动,如果再次点击按钮会再次进入死循环,这时候界面依旧可以动,但注意的是这时候是有两个死循环正在执行,需要退出两次才算真正的退出死循环。

    📢博客主页: 主页
    📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    📢本文由 梦回阑珊 原创,首发于 CSDN,转载注明出处🙉
    📢代码改变世界,你来改变代码!✨

  • 相关阅读:
    Dapr学习(4)之eShopOnDapr部署(Rancher2.63&k3s)
    二叉树详解(求二叉树的结点个数、深度、第k层的个数、遍历等)
    MapReduce: Simplified Data Processing on Large Clusters 翻译和理解
    JAVA自定义注解记录操作日志
    Qt——对话框详解
    165 pbi-utils 使用文档
    Flink / Scala- BroadCast 广播流数据先到再处理 Source 数据
    [附源码]Python计算机毕业设计宠物寄养管理系统
    Linux 终端与进程
    RocketMQ源码阅读(九)DefaultMQProducer消息发送
  • 原文地址:https://blog.csdn.net/cs1395293598/article/details/134381277