QTimer超时信号在每个超时事件发生多次

时间:2018-02-04 00:08:41

标签: c++ qt qtimer

我在MainWindow类中定义了一个QTimer对象,如下所示:

QTimer *timer_ld = new QTimer(this) ;

并将其连接到MainWindow类的插槽:

connect(timer_ld , SIGNAL(timeout()) , this , SLOT(timer_ld_timeout())) ;
        timer_ld->start(time_trigge*1000) ;

我定义了timer_ld_timeout()函数,如下所示:

void MainWindow::timer_ld_timeout(){
    iter_call_timer += 1 ;
    img_file_path = img_file_path_buff + img_name + QString::number(MainWindow::iter_img) + img_exten ;
    MainWindow::open() ;}

iter_call_timer变量仅用于调试目的...... 在MainWindow :: open()函数只是一个StatusBar的showMessage memeber,它告诉我iter_call_timer的值。

现在假设time_trigge变量取值为5(确保此值在运行时间内永远不会改变) 第一次超时事件在大约5秒后正确发生,但大约100ms后发生第二次呼叫,5秒后再次发生第三次呼叫,再次发出100ms第四次呼叫,依此类推(我使用秒表监控时间)... 例如,在大约5.2秒之后,iter_call_timer取值为2。

我不知道为什么会这样......

1 个答案:

答案 0 :(得分:0)

您的问题没有提供一个可以帮助明确提供帮助的运行示例。这是一个适合我的例子,可以帮助你:

我不确定用秒表监控文件操作是否是一个好方法。可能需要刷新流或/并配置缓冲区大小。因此,此示例使用QElapsedTimer进行内部时间测量。

elapsed.h

#ifndef ELAPSED_H
#define ELAPSED_H

#include <QElapsedTimer>
extern QElapsedTimer *elapsedTimer;
extern qint64 last, now;

#define printfElapsed \
    now=elapsedTimer->nsecsElapsed();\
    qInfo(__FILE__ ":%d (%lli ns) > dt= %lli ns",__LINE__,now,now-last);\
    last=now;

#endif // ELAPSED_H

的main.cpp

#include "mainwindow.h"
#include <QApplication>

#include "elapsed.h"
QElapsedTimer *elapsedTimer;
qint64 last=0, now=0;

int main(int argc, char *argv[])
{
    elapsedTimer = new QElapsedTimer();
    elapsedTimer->start();
    printfElapsed;

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>

class MainWindow : public QMainWindow
{
    Q_OBJECT

    const int time_trigge = 5;

public:
    MainWindow(QWidget *parent = 0);

private slots:
    void timer_ld_timeout();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QTimer>
#include "elapsed.h"

MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
    printfElapsed;

    QTimer *timer_ld = new QTimer(this) ;

    connect( timer_ld ,
             SIGNAL(timeout()) ,
             this,
             SLOT(timer_ld_timeout()) );

    timer_ld->setInterval(1000);
    printfElapsed;
    timer_ld->start(time_trigge*1000);
}

void
MainWindow::timer_ld_timeout()
{
    printfElapsed;
    static unsigned int iter_call_timer = 0;
    qInfo("%d",++iter_call_timer);
}

应用程序输出如下:

Starting /tmp/build-timer-Desktop_Qt_5_10_0_GCC_64bit-Release/timer...
timer/main.cpp:12 (103 ns) > dt= 103 ns
timer/mainwindow.cpp:8 (56759122 ns) > dt= 56759019 ns
timer/mainwindow.cpp:18 (56775739 ns) > dt= 16617 ns
timer/mainwindow.cpp:25 (5065388463 ns) > dt= 5008612724 ns
1
timer/mainwindow.cpp:25 (10064517746 ns) > dt= 4999129283 ns
2
timer/mainwindow.cpp:25 (15064648494 ns) > dt= 5000130748 ns
3
timer/mainwindow.cpp:25 (20061585036 ns) > dt= 4996936542 ns
4
timer/mainwindow.cpp:25 (25064713109 ns) > dt= 5003128073 ns
5
timer/mainwindow.cpp:25 (30060972992 ns) > dt= 4996259883 ns
6

以毫秒为单位:

0.000105
59.170396
0.016693
5166.980454
4999.163593
5000.16246
4999.221772
5001.169682

这表明在计时器启动之前,我的计算机需要将近60毫秒。然后,定时器以小抖动调用其插槽到预期时间。

你说,你监控,在100毫秒到5000毫秒之间切换。这可能有以下原因:

  • 您的测量方法。
  • 你产生超支。