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发数据,用示波器抓的数据流:
大部分资料和结论来自网络,只是做了相关整合,希望对大家有用!
参考博文:
http://blog.csdn.net/andy_93/article/details/52776283
http://blog.csdn.net/dbzhang800/article/details/6326856
- QT 高精计时器
- Qt笔记之计时器
- Qt 计时器与随机数
- Qt Creator计时器实现
- Qt笔记之计时器
- QT即时计时器
- Qt 计时器与随机数
- Qt实现倒计时器
- C# 中的高性能计时器
- C# 中的高性能计时器
- 一个精度很高的计时器
- Qt Windows下多媒体计时器使用举例
- 计时器
- 计时器
- 计时器
- 计时器
- 计时器
- 计时器
- 线性 休眠=day=11.22
- 一步一步开始FPGA逻辑设计 - 高速接口之PCIe
- 解决nginx 504 Gateway Time-out的方法
- OTA简单介绍
- Unity3D中关于游戏摇杆的实现方法
- QT 高精计时器
- FusionCharts参数说明
- Android中webview与JS交互、互调方法
- 哈理工高年级院赛题解(非官方)
- maven项目下solr和spring的整合配置
- 二维码及其图片页面展示
- xdebug调试(二)
- Tomcat启动问题
- C++Primer第五版 第三章习题答案(11~20)