最近需要使用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...