码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 《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,转载注明出处🙉
    📢代码改变世界,你来改变代码!✨

  • 相关阅读:
    张一鸣:我遇到的优秀年轻人的5个特质
    【运维工具】当你的老板站在你背后,看你处理故障......
    leetcode - 1428. Leftmost Column with at Least a One
    CSDN每日一练(Java)--小艺的英文名
    大三学生HTML个人网页作业作品——电影动漫言叶之庭(4页)带音乐
    UE5实战篇二(对话系统1):导语
    ROS学习笔记07、机器人系统仿真(URDF、Xacro、Arbotix、Gazebo)
    [ CTF ]【天格】战队WriteUp-2022年第二届“长城杯”网络安全大赛
    【Linux系列】vmware虚拟机网络配置详解
    【Unity HDRP渲染管线下的WorleyUtilities文件,“Hash”函数】
  • 原文地址:https://blog.csdn.net/cs1395293598/article/details/134381277
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号