QT 高精計時器

2021-07-24 19:41:56 字數 1927 閱讀 4261

最近需要使用qt5寫個上位機串列埠助手,給嵌入式系統傳送指令,時間要求比較短,需要22ms一次資料流。

在網上查閱資料後發現,qt有兩種方法設定定時器:

1.qobject

2.qtimer

當然網上關於怎樣使用這兩個類的講解很多,如:

然而乙個比較尷尬的事情是,這兩個定時器對於20ms以下的定時,工作的很好,對於20ms到30多ms卻很糟糕,40ms以上又能正常工作。

這到底是什麼鬼呢?

原來對於qt的定時器,有兩種機制:

1. 當時間小於20ms時且系統支援多**計時器,qt將採用多**計時器

2. 否則,qt使用普通定時器

22ms這個尷尬的時間正好使qt使用普通定時器,精度顯而易見也就相差甚遠了。

那就需要自己寫個timer類,來直接呼叫系統的多**計時器了。

**:

在qt中新增標頭檔案,mmtimer.h如下:

#ifndef mmtimer_h

#define mmtimer_h

#include

#include

class mmtimer : public qobject

;#endif // mmtimer_h

原始檔mmtimer.cpp

#include "mmtimer.h"

#include

#ifdef __mingw32__ //w32api bug

#define time_kill_synchronous 0x0100

#endif

void winapi callback mmtimer_proc(uint timerid, uint, dword_ptr user, dword_ptr, dword_ptr)

mmtimer::mmtimer(int interval, qobject *parent) :

qobject(parent),m_interval(interval),m_id(0)

mmtimer::~mmtimer()

void mmtimer::start()

void mmtimer::stop()

}

.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()函式

Qt計時器的使用

在我們的日常設計程式中,經常需要固定時間段來重新整理介面或者處理一些事務,這個時候計時器就很重要。比如說在用qt設計乙個時間顯示程式時 我們先看看它的訊號 槽機制 public q slots void start int msec void start void stop q signals vo...

python計時器 python 計時器

import sysclassshowtime qwidget def init self super init self.istimestart false 標記時間是否開始計時 self.setwindowtitle qlable 顯示計時時間 self.lable time val qlabe...

python計時器單位 python計時器類

import time as t class mytimer def init self self.unit 年 月 日 時 分 秒 self.prompt 未開始計時 self.lasted self.start 0 self.stop 0 def str self return self.pro...