高精度定时器在windows10下失效及其解决方法

10 篇文章 0 订阅
4 篇文章 0 订阅

很多地方要用到高精度定时器,比如实时通信、多媒体处理、游戏开发等。

我开发的软交换系统中,多媒体处理要用到高精度的定时器,在windows下常见的做法是:

先设置定时器精度为1毫秒:

timeBeginPeriod(1);

这步很关键,否则定时器的精度很低,大概只有15.6毫秒,基本不能用。

然后使用这样一组函数:

CreateTimerQueue();

CreateTimerQueueTimer(&t, timer, (WAITORTIMERCALLBACK)OneMilliSecondProc, this, 0, 10, 0);  // 每10毫秒调用一次回调函数

但最近发现在最新版的windows10下出问题了,设置精度为1毫秒,程序也没有出错,但实际的精度降低到15.6毫秒,实际上精度设置完全不起作用了。

苦思良久不得其解,后来搜到一篇老外写的文章:

Windows Timer Resolution: The Great Rule Change(Windows计时器分辨率:极大的规则更改)

原来是微软故意这么干的,他觉得设置精度到毫秒级别,太耗费资源了,如果是移动设备,频繁唤醒切换线程,电池消耗得很快。于是微软宁肯抛弃强兼容性传统,也坚决让这函数失效。

怎么办?

解决方法是使用C++1x的时间函数,自己封装一个定时器,下面为示例代码:

// 定时器函数
int Timer11()
{
	chrono::steady_clock::time_point tp = std::chrono::steady_clock::now();
	auto dt_micri = std::chrono::microseconds(10000);  // 10ms
	while (true) {
		tp += dt_micri;
		this_thread::sleep_until(tp);

		// 回调函数,应用写在这函数里
		OneMilliSecondProc();
	}

	return(0);
}

// 调用的例子
thread thd(Timer11);  // 创建线程
thd.detach();

我的编译器是Microsoft Visual C++ 2017。经过测试,发现这个方法制作的定时器精度相当高,而且代码简单,通用,在最新版本的windows10下工作正常,运行良好。

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在WinForm下使用高精度定时器可以通过以下步骤实现: 首先,确保你的项目引用了System.Diagnostics命名空间。 其次,创建一个Timer对象并设置其Interval属性为你想要的定时器精度。注意,Timer的默认精度为15.6毫秒,如果你需要更高精度定时器,可以将其Interval属性设置得更小。 然后,创建一个事件处理程序来处理Timer对象的Tick事件。这个事件处理程序将会在每次定时器触发时执行。在事件处理程序中,你可以编写你需要执行的代码逻辑。 最后,将你的事件处理程序与Timer对象的Tick事件关联,这样当定时器触发时,你的代码逻辑就会被执行。 下面是一个使用高精度定时器的示例代码: ``` using System; using System.Diagnostics; using System.Windows.Forms; namespace HighPrecisionTimerExample { public partial class MainForm : Form { private Timer timer; public MainForm() { InitializeComponent(); // 创建高精度定时器 timer = new Timer(); timer.Interval = 1; // 设置定时器精度为1毫秒 timer.Tick += Timer_Tick; // 关联事件处理程序 } private void Timer_Tick(object sender, EventArgs e) { // 在这里编写你的代码逻辑,每当定时器触发时会执行这里的代码 // 例如:更新UI界面、进行某些计算等操作 } private void startButton_Click(object sender, EventArgs e) { timer.Start(); // 启动定时器 } private void stopButton_Click(object sender, EventArgs e) { timer.Stop(); // 停止定时器 } } } ``` 在这个示例中,我们创建了一个名为timer的Timer对象,并将其精度设置为1毫秒。当用户点击"startButton"按钮时,定时器将会启动,每当定时器触发时,Timer_Tick事件处理程序将会执行。当用户点击"stopButton"按钮时,定时器将会停止。 通过以上步骤,我们可以在WinForm下使用高精度定时器来实现我们的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值