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

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框架提供了一个跨平台的接口,用于处理音频、视频和时间...

    QT计时器小程序

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

    QTwindows下OpenSSL的使用

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

    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定时器和QLCDNumber实现背景透明计时器

    在这个项目中,“qt定时器和QLCDNumber实现背景透明计时器”是一个利用Qt的特性来创建一个带有透明背景的计时器应用。下面我们将详细探讨这两个关键组件以及如何结合它们实现透明背景。 首先,QTimer是Qt中的一个...

Global site tag (gtag.js) - Google Analytics