QT 高精计时器

来源:互联网 发布:酷狗mac版歌词下载 编辑:程序博客网 时间:2024/06/10 22:43

最近需要使用QT5写个上位机串口助手,给嵌入式系统发送指令,时间要求比较短,需要22ms一次数据流。
在网上查阅资料后发现,QT有两种方法设置定时器:
1. QObject
2. QTimer
当然网上关于怎样使用这两个类的讲解很多,如:http://blog.csdn.net/andy_93/article/details/52776283。

然而一个比较尴尬的事情是,这两个定时器对于20ms以下的定时,工作的很好,对于20ms到30多ms却很糟糕,40ms以上又能正常工作。

这到底是什么鬼呢?
原来对于QT的定时器,有两种机制:
1. 当时间小于20ms时且系统支持多媒体计时器,QT将采用多媒体计时器
2. 否则,QT使用普通定时器

22ms这个尴尬的时间正好使QT使用普通定时器,精度显而易见也就相差甚远了。

那就需要自己写个Timer类,来直接调用系统的多媒体计时器了。

代码:
在QT中添加头文件,mmtimer.h如下:

#ifndef MMTIMER_H#define MMTIMER_H#include <qt_windows.h>#include <QtCore/QObject>class MMTimer : public QObject{   Q_OBJECTpublic:    MMTimer(int interval, QObject *parent = 0);   ~MMTimer();signals:   void timeout();public slots:   void start();   void stop();friend void WINAPI CALLBACK mmtimer_proc(uint, uint, DWORD_PTR, DWORD_PTR, DWORD_PTR);private:   int m_interval;   int m_id;};#endif // MMTIMER_H

源文件 mmtimer.cpp

#include "mmtimer.h"#include <MMSystem.h>#ifdef __MINGW32__ //w32api bug#define TIME_KILL_SYNCHRONOUS 0x0100#endifvoid WINAPI CALLBACK mmtimer_proc(uint timerId, uint, DWORD_PTR user, DWORD_PTR, DWORD_PTR){    MMTimer *t = reinterpret_cast<MMTimer*>(user);    emit t->timeout();}MMTimer::MMTimer(int interval, QObject *parent) :    QObject(parent),m_interval(interval),m_id(0){}MMTimer::~MMTimer(){    stop();}void MMTimer::start(){    m_id = timeSetEvent(m_interval, 1, mmtimer_proc, (DWORD_PTR)this,                 TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);}void MMTimer::stop(){    if (m_id){        timeKillEvent(m_id);        m_id = 0;    }}

.pro文件中添加:

LIBS += -lwinmm

mainwindow.h添加超时处理函数:

void handleTimeout();

mainwindow.cpp构造函数中,添加:

     MMTimer *mtr = new MMTimer(22,0); //设置定时22ms     connect(mtr,SIGNAL(timeout()),this,SLOT(handleTimeout()));//定时器时间到,运行超时处理函数handleTimeout()     mtr->start();//定时器开始工作

添加 void MainWindow::handleTimeout()函数

void MainWindow::handleTimeout(){    ...//运行超时处理事件}

最后上一张QT发数据,用示波器抓的数据流:

22ms

大部分资料和结论来自网络,只是做了相关整合,希望对大家有用!
参考博文:

  • http://blog.csdn.net/andy_93/article/details/52776283

  • http://blog.csdn.net/dbzhang800/article/details/6326856

0 0
原创粉丝点击