- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个无窗口计时器(没有 WM_TIMER),它只在给定的时间段过去后触发一次回调函数。它作为 SetTimer()/KillTimer()
实现。时间段足够小:100-300 毫秒。
对于每个如此短的时间间隔调用 SetTimer()/KillTimer()
对是否足够便宜(我的意思是性能)?
如果我有 100 个周期性调用 SetTimer()/KillTimer()
的定时器会怎样?系统中可以同时存在多少个Window定时器对象?
问题是:使用一堆这样的计时器对象并依赖于良好的 Windows 计时器实现,或者创建一个每 30 毫秒计时一次的 Windows 计时器对象,并为它订阅所有自定义的 100-300 毫秒一次性计时器。
谢谢
最佳答案
当您尝试使用计时器消息时,问题在于它们是低优先级消息。实际上它们是假消息。计时器与底层内核计时器对象相关联 - 当消息循环检测到内核计时器发出信号时,它只是用一个标志标记当前线程消息队列,指示下一次调用 GetMessage - 当没有其他消息要处理时 - 应该综合及时返回一个 WM_TIMER 消息。
对于潜在的大量定时器对象,系统是否会公平地为所有定时器公平地发送定时器消息并不明显,并且任何系统负载都可以在很长一段时间内完全阻止 WM_TIMER 消息的生成。
如果您可以控制消息循环,则可以使用维护自己的计时器事件列表(以及应该发生的 GetTickCount 时间戳)和 MSGWaitForMultipleObject - 而不是 GetMessage 来等待消息。使用 dwTimeout 参数提供最小间隔 - 从现在开始 - 直到下一个计时器应该发出信号。因此,每当您有一个计时器要处理时,它就会从等待消息中返回。
和/或者你可以使用waitable timers - 在具有 MSGWaitForMultipleObjects 的 GUI 线程上,或仅在工作线程上,直接访问较低级别的计时功能。
关于c++ - SetTimer() 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893869/
背景 MFC CWnd::SetTimer调用 WinAPI 的 SetTimer简单地。 _AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEve
Timestamp[] lastreply = new Timestamp[100]; replyr = lastreplyr[i].getTime(); System.out.println("Re
感谢您的帮助!其主要目标是停止计时器。但它不起作用。我知道这不起作用,因为我从另一个函数调用局部变量,但如果我将该变量声明为全局变量,则 setTime 会自动启动,这不是我想要的。如何解决这个问题,
在我的一个项目中,我需要高效地安排要反复执行的不同操作,每个操作都有自己的时间间隔。 我一直在想,当我使用 SetTimer函数,后台发生了什么? 是否创建了新线程?它是否在后台运行并占用我的 CPU
我编写的代码在窗口未聚焦时检测按键: // MainHamsterDlg.cpp : implementation file #include "stdafx.h" #include "MainHam
我有一个无窗口计时器(没有 WM_TIMER),它只在给定的时间段过去后触发一次回调函数。它作为 SetTimer()/KillTimer() 实现。时间段足够小:100-300 毫秒。 对于每个如此
代码如下: function _niceTime($minute){ $m = $minute - 5; $date = new DateTime();
下面的代码将日期设置为 2015 年 6 月 7 日午夜。为什么?我的时区是 UTC-07:00 格雷格 Calendar HuntStart = Calendar.getIns
我对SetTimer()函数感到困惑。 SetTimer()具有三个参数: SetTimer(1,2000,Timerflow); 但是,我已经看到了另一个带有四个参数的SetTimer版本: Set
目前我正在尝试在 VBA 中实现一个计时器类。为此,我使用了 Windows API 的 SetTimer 和 KillTimer 函数...... 这是来自 Msdn 的界面: UINT_PTR
我已经基于 Java 版本创建了一个 JavaScript 版本的 Little Man Computer,网址为 http://www.atkinson.yorku.ca/~sychen/resea
Calendar lastEditDate = Calendar.getInstance(); lastEditDate.setTime(rs.getD
此代码导致输出 1。当 setTime 的参数是添加到 1970 年 1 月 1 日午夜的毫秒数时,为什么会这样?当然应该为 0 吗? var d = new Date(); d.setTime(0)
有什么方法可以获取由 SetTimer 函数创建的计时器的当前进度? 最佳答案 这是 Hans 评论的一个实现。单击该按钮会显示距离下一个预定(预期)WM_TIMER 消息的剩余时间。通过在 Debu
这个问题在这里已经有了答案: Can I use a SetTimer() API in a console C++ application? (6 个答案) 关闭 9 年前。 我有以下程序。我想知
我的 C++ 应用程序有一个无窗口计时器,用于定期清理从未(也永远不会)完全处理的潜在通信数据。问题是永远不会调用回调函数。我的类构造函数在返回之前执行以下代码: if ( (this->m_
我需要定时器每 1 秒启动一次功能。 我试过SetTimer,我的代码: const UINT_PTR TIMER_ID = 1000; DWORD DownloadThread() { Se
使用 SetTimer 时这样: SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL); DoSomethingElse()
我尝试使用 SetTimer API 每隔 X 分钟调用一个函数。所以,我写了这段测试代码 void f() { printf("Hello"); } int main() { SetTimer(
当我尝试使用 Windows SetTimer 函数时,它会为计时器生成一个 IDEvent,即使我已经指定了一个! 这个: SetTimer(0,999,10000,@timerproc); 在:
我是一名优秀的程序员,十分优秀!