在QTimer源码分析(以Windows下实现为例)
一文中,我们看到了Qt在windows下对计时器的使用:
- 对于间隔为零的情况,Qt并没有动用系统的计时器
- 对于间隔非零的情况
- 间隔小于20ms 且系统支持多媒体计时器,则使用多媒体计时器
- 否则,使用普通计时器
Qt 的这种策略应该能很好地满足我们的需求了,但qtcn上一个网友还是比较期待自己直接调用系统的多媒体计时器。既然这样,自己还是尝试写写吧,写一个自己的Timer类
代码
- 代码还是比较简单的,头文件 mmtimer.h 如下:
#ifndef MMTIMER_H
#define MMTIMER_H
#include <qt_windows.h>
#include <QtCore/QObject>
class MMTimer : public QObject
{
Q_OBJECT
public:
explicit 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
#include "mmtimer.h"
#include <MMSystem.h>
#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 *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;
}
}
说明
上面的代码应该不需要什么解释了:
- timeSetEvent 和 timeKillEvent 可直接查阅 MSDN
- 另外,MinGW的win32api包,对TIME_KILL_SYNCHRONOUS没有定义,代码中做了一点修正
请确保正确链接所需要的库
LIBS += -lwinmm
注意:MSDN 对timeSetEvent的介绍中这么说的(对此不做评论)
Note This function is obsolete. New applications should use CreateTimerQueueTimer to create a timer-queue timer.
分享到:
相关推荐
在本教程中,我们将探讨如何在Windows环境下使用Qt 5.3来创建一个炫酷的、可自适应缩放且支持4K分辨率的计时器,包括正计时和倒计时功能,以及带有圆环进度条的可视化展示。 首先,我们需要了解Qt中的计时器类型。...
在本文中,我们将深入探讨如何使用Qt框架中的`QTimer`类来实现实时计时器功能,包括开始计时、停止计时、暂停计时和打点等操作。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,特别适合创建图形用户界面...
在Qt框架中,虽然有`QElapsedTimer`类可以提供高精度计时,但它在Windows平台上默认使用的是`GetTickCount64()`,精度较低。如果需要微妙级别的计时,应使用上述的Windows API。结合Qt,可以创建一个自定义的计时器...
在本文中,我们将深入探讨如何使用Qt框架来实现一个具有启动、暂停和继续功能的计时器。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它为开发者提供了丰富的功能,包括创建复杂的用户界面和实时系统交互。...
本篇文章将深入探讨Qt多媒体定时器的使用方法,以及如何在Windows环境下利用它来满足高精度的时间控制需求。 首先,让我们了解Qt多媒体模块。Qt Multimedia框架提供了一个跨平台的接口,用于处理音频、视频和时间...
本教程将详细介绍如何在Qt Windows平台下配置和使用OpenSSL。 首先,你需要下载适用于Windows的OpenSSL库。OpenSSL提供了静态库和动态库两种形式,动态库文件通常以`.dll`为扩展名。在本案例中,你已经拥有一个名为...
QT计时器小程序是一款基于C++编程语言,利用QT框架开发的应用程序。QT是一个功能强大的开源跨平台应用程序开发框架,支持Windows、Linux、MacOS等多个操作系统。它为开发者提供了丰富的库和工具,使得构建图形用户...
在本项目"QT实现的计时器 Timer Countdown"中,我们探讨的是如何利用QT库创建一个功能完备的倒计时计时器,它支持暂停功能,适用于多种应用场景,如游戏、考试倒计时等。 首先,我们需要了解QT中的计时器类——...
**Qt计时器源码实例详解** 在编程领域,计时器是一种常用工具,用于实现时间相关的功能,如定时执行任务、测量代码运行时间等。Qt库提供了丰富的功能,包括一个强大的计时器类——`QTimer`,使得在C++环境中创建...
下面将详细介绍如何在Qt中创建和使用这种计时器。 1. **QTimer类**: Qt中的计时器功能主要由`QTimer`类提供,它是`QObject`的子类,可以发送信号来触发指定的槽函数。`QTimer`提供了单次触发和周期性触发两种模式。...
在Windows操作系统上,QT提供了多种安装方式,包括离线安装包和在线安装器。本文将详细讲解如何进行"QT Windows在线安装"。 首先,你需要访问QT官方网站(https://www.qt.io/download)获取最新的在线安装器。通常...
qt实现计时器,可以实现00:00:00的计时效果。可以根据全局变量flag标志位的变化控制计时器的开始和结束!我是新人,写的有很多不足还望 高手指教谢谢!
多媒体计时器(Multimedia Timer)相比普通的Windows消息定时器,提供了更精确的定时控制,适合对时间精度要求高的应用,比如音频、视频处理或者游戏开发。下面将详细介绍如何在VC++中创建这样的漂亮窗口以及如何...
这个“qt计时器(动态图与时钟)”项目是针对初学者设计的,它演示了如何使用Qt的基本功能来实现动画效果和时间显示。 首先,让我们来看看计时器在Qt中的应用。在Qt中,QTimer类是实现定时任务的关键。QTimer提供了...
相比之下,Windows多媒体计时器是一种低级的定时服务,旨在提供比标准系统定时器更高的精度。它允许开发者设置毫秒级别的间隔,并且可以同时管理多个独立的计时器。多媒体计时器的精度测试同样需要记录实际触发时间...
7. **多媒体格式支持**:QT多媒体框架支持多种音频和视频格式,如MP3、WAV、MP4、AVI等,但可能需要依赖于系统中安装的解码器。 8. **跨平台性**:由于QT的跨平台特性,这个多媒体播放器可以在多种操作系统上运行,...
### Qt for Windows 版本下编译 QtDBus 模块 #### 背景与目的 Qt 是一个跨平台的应用程序开发框架,广泛应用于桌面应用的构建。Qt 提供了一系列的功能模块来支持开发者的需求,其中之一就是 QtDBus。QtDBus 是用于...
QAxWidget允许我们在Qt应用中使用Windows上的ActiveX控件,例如IE浏览器控件(名为"Shell.Explorer.2")。 以下是实现步骤的简要概述: 1. **创建Qt项目**:首先,你需要创建一个新的Qt项目,选择合适的工程类型,...
在Windows下,可能使用了WinAPI或者Windows SDK来实现特定功能,而在Linux下,可能会利用POSIX API或者标准C库。为了确保代码在不同平台上兼容,开发者需要遵循特定的跨平台编程原则,比如避免使用特定平台的API,...
在本文中,我们将深入探讨如何使用Qt框架在Windows操作系统上进行本地服务的管理。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,而Windows服务则是系统后台运行的程序,通常在用户登录之前就开始执行任务...