Linux 下 Qt关于微秒级别的定时器

Linux 下 Qt关于微秒级别的定时器,第1张

select可以达到微妙级别,你百度下select timer,下面是win下面使用select的例子#include<iostream>#include <iomanip>#include <windows.h>#include <winsock.h>#pragma comment(lib, "ws2_32.lib")using namespace stdint main(){ DWORD dwVersion = 0 WSADATA wsaData DWORD dwErr = 0 dwErr = WSAStartup(MAKEWORD(0x2, 0x2), &wsaData) if (0 != dwErr) {printf("winsock init error!\n")return -1} SOCKET s = socket(AF_INET, SOCK_STREAM, 0) if (INVALID_SOCKET == s) { printf("create a socket error!\n") WSACleanup() return -1 } // 设置为非阻塞 int nRet = 0 u_long lRet = 1 nRet = ioctlsocket(s, FIONBIO, &lRet) if (SOCKET_ERROR == nRet) { printf("set socket error!\n") closesocket(s) WSACleanup() return -1 } int time=0 while( 1 ){ fd_set rfds struct timeval tval FD_ZERO( &rfds ) FD_SET(1,&rfds) tval.tv_sec = 1 /*秒*/ tval.tv_usec =0 /*微秒, 1秒=10的3次方毫秒=10的6次方微妙*/ int ret =select( 1, &rfds, NULL, NULL, &tval ) if(ret==0 ){ cout<<setfill('0')<<setw(3)<<++time<<" s"<<endl } else {cout<<WSAGetLastError()<<endl break } } WSACleanup() return 0}

如果此类继承于QObject,可以直接调用startTimer函数,函数原型如下:

此函数开启定时器,并返回定时器的ID。

另外通过重载timerEvent函数来进行事件处理,其函数原型如下:

在该函数中进行事件处理,可通过定时器ID的判断(event->timerId() == m_TimerID),来处理多个定时器。

关闭定时器的函数为killTimer,函数原型如下:

class Example:publicQWidget

{

    Q_OBJECT

public:

    Example(QWidget*parent= 0)

    ~ Example()

    virtualvoidtimerEvent(QTimerEvent*event)

private:

    int m_TimerID //定时器ID

    int m_TimerLeaveSeconds//定时器剩余秒数

}

Example::Example(QWidget*parent)

    :QWidget(parent),

    m_TimerID(-1),

    m_TimerLeaveSeconds(0)

{

    ui.setupUi(this)

    m_TimerID=startTimer(1000)

}

void Example::timerEvent(QTimerEvent*event)

{

    if(event->timerId() ==m_TimerID)

    {

        //做相应的事件处理

        killTimer(m_TimerID)//达到条件,杀死定时器

    }

}

在类中添加QTimer类型成员,使用start()来开始并且把它的timeout()信号函数连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

QTimer *timer = new QTimer(this)

connect(timer, SIGNAL(timeout()), this, SLOT(update()))

timer->start(1000)

start()函数是重载函数,其原型如下:

(1)void QTimer::start()

启动或者重新启动定时器,其时间间隔是interval,可通过 setInterval(int msec) 函数进行设置。

(2)void QTimer::start(int msec)

启动或者重新启动定时器,时间间隔单位是毫秒。

结束一个定时器。

connect函数进行信号与槽的连接,每隔设置的固定间隔就会执行槽函数(update())。

注意:如果在类头文件中声明了一个QTimer变量,并且在构造函数中new了,不要忘了在析构函数中delete,并置位NULL。

另外,QTimer的精确度依赖于底下的 *** 作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

(1)void QTimer::singleShot(int msec, const QObject * receiver, const char * member)

这是个静态函数,能够在给定的时间间隔后调用槽,并不是多次触发该槽函数,该槽函数只执行一次。使用此函数非常方便,也不必创建本地qTimer对象。

实例:

        #include <qapplication.h>

        #include <qtimer.h>

        int main( int argc, char **argv )

        {

            QApplication a( argc, argv )

            QTimer::singleShot( 10*60*1000, &a, SLOT(quit()) )

                ... // 创建并且显示你的窗口部件

            return a.exec()

        }

这个示例程序会自动在10分钟之后终止(也就是600000毫秒)。

receiver是正在接收的对象并且member是一个槽。时间间隔是msec。

(2)bool QTimer::isActive () const

如果定时器正在运行,返回真,否则返回假。

(3)void QTimer::changeInterval ( int msec )

改变定时器时间间隔为msec毫秒。如果这个定时器信号是运行的,它将会被停止并且重新开始,否则它将会被开始。

Qt中定时器用于间隔一段时间执行一次 *** 作,循环执行,直至定时器停止或被杀死。有两种使用方法, QObject类 与 QTimer类 。个人比较习惯使用QTimer类,信号与槽方式比较简洁灵活。

方法一:QObject中的定时器的使用,需要用到三个函数

1、int QObject::startTimer ( int interval ) //开启定时器,执行周期为interval毫秒。

此函数开启成功后,返回这个定时器的ID,并每隔interval毫秒时间进入一次timeEvent函数,直至定时器停止或被杀死。

2、void QObject::timeEvent ( QTimerEvent *event ) //需重写timeEvent函数,相关 *** 作在此函数中执行。

当定时器超时后会进入此函数,可以通过event->timerId()来确定当前执行的定时器是哪个。

3、void QObject::killTimer ( int id )    //杀死目的id号的定时器,停止循环。

示例:

方法二:使用QTimer类(信号与槽)

1、创建QTimer类对象,

 QTimer *m_timer= new QTimer ( this )

2、连接信号与槽,定时器超时后会发出 timeout () 信号,超时时执行槽函数 mySlot()

connect ( timer , SIGNAL ( timeout()) , this ,SLOT( mySlot()) )

3、开启定时器,周期为msec毫秒

timer->start( msec )


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8790555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存