我在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。
我不知道为什么会这样......
答案 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毫秒之间切换。这可能有以下原因: