C#调用多媒体定时器
来源:互联网 发布:数据交换 安全 编辑:程序博客网 时间:2024/06/06 12:33
在Windows操作系统下,为了获得高精度的定时器,大多数时候采用多媒体定时器,其分辨率可达到1ms,适用于对实时性要求比较高的场合(虽然Windows自身为非实时系统,但是在很多场合还是够用的);而SetTimer提供的定时精度相比较而言,不太精确,适用于对时间性要求不高的系统里面。
当我们使用Visual C++作为开发语言时,调用多媒体定时器的API函数即可解决定时器问题;但是有时候需要采用C#作为开发语言,进行产品开发,但是在.NET下没有提供多媒体定时器的封装,当然可以采用C#提供的平台调用方法实现对多媒体定时器API函数的调用,从而达到我们的目的。
采用平台调用的方法实现优劣,这里不进行讨论。
这里提供另外一种方法,实现多媒体定时器在C#中的使用,采用C++/CLR对多媒体定时器API函数进行封装,提供简单易用的接口,实现在C#下高精度定时器。该封装类分为x86版本和x64版本,根据需要引用。
该封装的优点是:
简化了调用,调用过程简单明了;
执行效率高。
缺点是:
需要Visual C++运行时的支持。
其主要接口实现如下:
namespace MmTimerNet{ // 摘要: // 简易多媒体定时器类 public class MmTimer : IDisposable { // 摘要: // 默认构造函数 public MmTimer(); // 摘要: // 获取或设置定时器自动运行的代理 public MmTimer.MmTimerRunLoop RunLoop { get; set; } // 摘要: // 最后的编译时间 // // 返回结果: // 最后的编译时间 public string BuilTime(); // // 摘要: // Dispose函数的实现 public override sealed void Dispose(); [HandleProcessCorruptedStateExceptions] protected virtual void Dispose(bool value); // // 摘要: // 使能定时器 // // 参数: // bEnable: // true-启动定时器, false-停止定时器 public void Enable(bool bEnable); // // 摘要: // 错误代码 // // 返回结果: // 错误代码 public uint ErrorCode(); // // 摘要: // 初始化定时器 // 参数: // interval: // 定时间隔 // // shotMode: // 定时器触发模式 // // dwUser: // 用户参数 // // runLoop: // 自动调用代理函数 // // 返回结果: // 0-正常,非0-错误代码 public short InitTimer(uint interval, EMmTimerShotMode shotMode, ulong dwUser, MmTimer.MmTimerRunLoop runLoop); // // 摘要: // 定时器是否已经使能 // // 返回结果: // true-定时器已经启动, false-定时器未启动 public bool IsEnabled(); // // 摘要: // 定时器ID // // 返回结果: // ID值 public uint TimerID(); // // 摘要: // 定时器的分辨率 // // 返回结果: // 分辨率 public static uint TimerRes(); // 摘要: // 定时器回调的代理类型 // // 参数: // timerID: // 定时器ID // // dwUser: // 用户参数 public delegate void MmTimerRunLoop(uint timerID, ulong dwUser); }}其主要调用过程如下:
1) 引用多媒体定时器的动态库(MmTimerNet.dll或MmTimerNet64.dll);
2) 定义MmTimer多媒体定时器的实例;
3) 初始化多媒体定时;
4) 使能多媒体定时器;
5) 关闭软件时,不使能多媒体定时器,释放资源。
具体调用示例代码如下:
public partial class MainFrm : Form { private MmTimerNet.MmTimer _mmTimer; private uint _count = 0; public MainFrm() { InitializeComponent(); Form.CheckForIllegalCrossThreadCalls = false; } private void MainFrm_Load(object sender, EventArgs e) { _mmTimer = new MmTimerNet.MmTimer(); _mmTimer.InitTimer(20, MmTimerNet.EMmTimerShotMode.Periodic_ShotMode, 0, _mmTimer_MmTimerRunLoop); _mmTimer.Enable(true); this.Text = _mmTimer.BuilTime(); } private void _mmTimer_MmTimerRunLoop(uint timerID, ulong dwUser) { _count++; textBox1.Text = _count.ToString(); } private void MainFrm_FormClosing(object sender, FormClosingEventArgs e) { _mmTimer.Enable(false); } }
封装的多媒体定时器采用Visual C++ 2010编写,在Visual Studio 2015中通过了测试,生成的示例代码在Windows 7、Windows 8和Windows 10操作系统上进行了测试,均运行可靠正常。
例程及库文件下载
0 0
- C#调用多媒体定时器
- C#多媒体定时器使用方法
- C#多媒体定时器
- C#多媒体定时器使用方法
- 多媒体定时器
- 多媒体定时器
- 多媒体定时器
- 多媒体定时器
- 多媒体定时器
- 多媒体定时器
- 多媒体定时器
- 在线程中调用多媒体定时器,当定时器超时时,出现内存错误!
- 怎样使用多媒体定时器
- 可恶的多媒体定时器
- 多媒体定时器详解
- 如何使用多媒体定时器
- 怎样使用多媒体定时器
- 多媒体高精度定时器介绍
- 调度算法
- Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
- C3P0的使用
- python中文编码问题
- Delphi XE10调用百度地图和百度导航
- C#调用多媒体定时器
- python 2.7下配置opencv
- 安装Apache服务器
- 《30天自制操作系统》学习笔记(四)
- js中的hasOwnProperty和isPrototypeOf方法使用实例
- C语言基础 printf输出字符串%s
- learning to hash
- Unity3D 视频教程列表,共 91 套!
- 从厦大退学,孤身一人来到北京创业整整一年