`
gaofen100
  • 浏览: 1227472 次
文章分类
社区版块
存档分类
最新评论

Qt Windows下多媒体计时器使用举例

 
阅读更多

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
  • 源码文件 mmtimer.cpp 如下:
#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.

分享到:
评论

相关推荐

    qt5.3 windows实现计时器

    在本教程中,我们将探讨如何在Windows环境下使用Qt 5.3来创建一个炫酷的、可自适应缩放且支持4K分辨率的计时器,包括正计时和倒计时功能,以及带有圆环进度条的可视化展示。 首先,我们需要了解Qt中的计时器类型。...

    利用Qt实设计计时器Timer

    在本文中,我们将深入探讨如何使用Qt框架中的`QTimer`类来实现实时计时器功能,包括开始计时、停止计时、暂停计时和打点等操作。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,特别适合创建图形用户界面...

    Windows计时器精确到微妙

    在Qt框架中,虽然有`QElapsedTimer`类可以提供高精度计时,但它在Windows平台上默认使用的是`GetTickCount64()`,精度较低。如果需要微妙级别的计时,应使用上述的Windows API。结合Qt,可以创建一个自定义的计时器...

    Qt实现计时器的启动、暂停与继续

    在本文中,我们将深入探讨如何使用Qt框架来实现一个具有启动、暂停和继续功能的计时器。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它为开发者提供了丰富的功能,包括创建复杂的用户界面和实时系统交互。...

    Qt多媒体定时器源代码

    本篇文章将深入探讨Qt多媒体定时器的使用方法,以及如何在Windows环境下利用它来满足高精度的时间控制需求。 首先,让我们了解Qt多媒体模块。Qt Multimedia框架提供了一个跨平台的接口,用于处理音频、视频和时间...

    QTwindows下OpenSSL的使用

    本教程将详细介绍如何在Qt Windows平台下配置和使用OpenSSL。 首先,你需要下载适用于Windows的OpenSSL库。OpenSSL提供了静态库和动态库两种形式,动态库文件通常以`.dll`为扩展名。在本案例中,你已经拥有一个名为...

    QT计时器小程序

    QT计时器小程序是一款基于C++编程语言,利用QT框架开发的应用程序。QT是一个功能强大的开源跨平台应用程序开发框架,支持Windows、Linux、MacOS等多个操作系统。它为开发者提供了丰富的库和工具,使得构建图形用户...

    QT实现的计时器 Timer Countdown

    在本项目"QT实现的计时器 Timer Countdown"中,我们探讨的是如何利用QT库创建一个功能完备的倒计时计时器,它支持暂停功能,适用于多种应用场景,如游戏、考试倒计时等。 首先,我们需要了解QT中的计时器类——...

    Qt写的计时器的源码实例

    **Qt计时器源码实例详解** 在编程领域,计时器是一种常用工具,用于实现时间相关的功能,如定时执行任务、测量代码运行时间等。Qt库提供了丰富的功能,包括一个强大的计时器类——`QTimer`,使得在C++环境中创建...

    qt 计时器 00:00:00形式

    下面将详细介绍如何在Qt中创建和使用这种计时器。 1. **QTimer类**: Qt中的计时器功能主要由`QTimer`类提供,它是`QObject`的子类,可以发送信号来触发指定的槽函数。`QTimer`提供了单次触发和周期性触发两种模式。...

    qt windows 在线安装

    在Windows操作系统上,QT提供了多种安装方式,包括离线安装包和在线安装器。本文将详细讲解如何进行"QT Windows在线安装"。 首先,你需要访问QT官方网站(https://www.qt.io/download)获取最新的在线安装器。通常...

    qt实现计时器

    qt实现计时器,可以实现00:00:00的计时效果。可以根据全局变量flag标志位的变化控制计时器的开始和结束!我是新人,写的有很多不足还望 高手指教谢谢!

    VC++漂亮窗口使用多媒体计时器的code

    多媒体计时器(Multimedia Timer)相比普通的Windows消息定时器,提供了更精确的定时控制,适合对时间精度要求高的应用,比如音频、视频处理或者游戏开发。下面将详细介绍如何在VC++中创建这样的漂亮窗口以及如何...

    qt计时器(动态图与时钟).zip

    这个“qt计时器(动态图与时钟)”项目是针对初学者设计的,它演示了如何使用Qt的基本功能来实现动画效果和时间显示。 首先,让我们来看看计时器在Qt中的应用。在Qt中,QTimer类是实现定时任务的关键。QTimer提供了...

    Qt教程-QTimer的精度测试

    相比之下,Windows多媒体计时器是一种低级的定时服务,旨在提供比标准系统定时器更高的精度。它允许开发者设置毫秒级别的间隔,并且可以同时管理多个独立的计时器。多媒体计时器的精度测试同样需要记录实际触发时间...

    QT实例-多媒体播放器

    7. **多媒体格式支持**:QT多媒体框架支持多种音频和视频格式,如MP3、WAV、MP4、AVI等,但可能需要依赖于系统中安装的解码器。 8. **跨平台性**:由于QT的跨平台特性,这个多媒体播放器可以在多种操作系统上运行,...

    qt for windows版本下编译qtdbus模块

    ### Qt for Windows 版本下编译 QtDBus 模块 #### 背景与目的 Qt 是一个跨平台的应用程序开发框架,广泛应用于桌面应用的构建。Qt 提供了一系列的功能模块来支持开发者的需求,其中之一就是 QtDBus。QtDBus 是用于...

    QT在windows上内嵌IE浏览器

    QAxWidget允许我们在Qt应用中使用Windows上的ActiveX控件,例如IE浏览器控件(名为"Shell.Explorer.2")。 以下是实现步骤的简要概述: 1. **创建Qt项目**:首先,你需要创建一个新的Qt项目,选择合适的工程类型,...

    跨平台C++计时器windows linux

    在Windows下,可能使用了WinAPI或者Windows SDK来实现特定功能,而在Linux下,可能会利用POSIX API或者标准C库。为了确保代码在不同平台上兼容,开发者需要遵循特定的跨平台编程原则,比如避免使用特定平台的API,...

    Qt:Windows编程—Qt实现本地服务管理 示例代码

    在本文中,我们将深入探讨如何使用Qt框架在Windows操作系统上进行本地服务的管理。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,而Windows服务则是系统后台运行的程序,通常在用户登录之前就开始执行任务...

Global site tag (gtag.js) - Google Analytics