• Qt 定时器处理函数导致屏幕刷屏


      在做智慧农业实训系统的时候,我开了个定时器用来判断界面节点的掉电情况。结果出现了刷屏的现象。郁闷,不解,以后可以深究为什么,从网上找了一篇博客来解决问题,尊重原版http://blog.csdn.net/jwybobo2007/article/details/8314271

    编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。

    主窗口类头文件加入:

      

    01.QThread* _voiceThread;  
    02.QTimer* _voiceTimer;

    构造函数加入:

    01.// 使用一个线程,跑定时器   
    02._voiceThread = new QThread;  
    03._voiceTimer = new QTimer;  
    04._voiceTimer->setSingleShot(true);  
    05.// 在moveToThread前先启动定时器,不然不在一个线程里,直接调用start会失败   
    06._voiceTimer->start(200);  
    07._voiceTimer->moveToThread(_voiceThread);  
    08.// 定时器对象和this不在一个线程里面,因此这边指定了连接方式为Qt::DirectConnection,由定时器所在线程直接触发_onVoiceTimeout   
    09.connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);  
    10.// 连接定时器槽,用来停止定时器   
    11.connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));  
    12._voiceThread->start();  

    析构函数加入:

    01.emit stop();  
    02._voiceThread->quit();  
    03._voiceThread->wait();  
    04.  
    05.delete _voiceTimer;  
    06.delete _voiceThread;  

    定时器槽:

    01.void Test::_onVoiceTimeout()  
    02.{  
    03.    // 执行任务   
    04.    // ...   
    05.    _voiceTimer->start(1000);  
    06.}  
  • 相关阅读:
    [LeetCode] 222. Count Complete Tree Nodes Java
    [LeetCode] 199. Binary Tree Right Side View Java
    自动加载的两种办法
    Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
    Java 面试
    Java 获取最近时间
    Java 倒序输出
    java 排序算法
    图片预览
    SSH三大框架的工作原理
  • 原文地址:https://www.cnblogs.com/onlycxue/p/2861564.html
Copyright © 2020-2023  润新知