Articles of 定时器

系统运行时是否有延时计时器?

为了实现我的Windows服务,我需要能够设置一个定时器,使系统在一定时间内处于工作状态。 所以我最初想出了下面的代码。 A)设置等待定时器(省略错误检查): HANDLE hWTimer = ::CreateWaitableTimer(NULL, FALSE, NULL); //As an example, set timer to wait for 40 minutes int nWaitMins = 40; LARGE_INTEGER li; ULONGLONG uiWaitMs = (ULONGLONG)nWaitMins * 60LL * 1000LL; li.QuadPart = -10000LL * uiWaitMs; //Convert to 100 nanosecond intervals (must be negative for relative time) ::SetWaitableTimer(hWTimer, &li, 0, NULL, NULL, FALSE); […]

是什么让我的计时器跑不准?

我有一个类,创build一个新的计时器,并轮询每个滴答远程队列(通过HTTP)。 public void Start() { _timer = new Timer((x) => { Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.fff") + " " + typeof(T).Name); var message = (Message)null; var messageBody = (T)null; try { if (!_queue.TryGet(out message)) return; messageBody = (T)JsonConvert.DeserializeObject(message.Body, typeof(T)); _messageDispatcher.Dispatch<T>(messageBody); _queue.Delete(message.Id); } catch (Exception ex) { _errorHandler.Handle(ex, message); } }, null, 0, _queueConsumerConfiguration.PollingInterval); } } 如果我创build了这个类的八个新实例,将轮询间隔设置为250ms,并调用它们,我假devise时器将非常准确地打勾。 定时器callback内部执行什么都不重要。 然而,这种情况并非如此。 01:03:23.305 […]

如何在Windows中以30ms的间隔完成10ms的CPU时间操作?

如何在Windows中以30ms的间隔执行需要大约10ms CPU时间的操作? (我可以允许+/- 5毫秒的余量) 我尝试过,并已经失败与睡眠API 🙂 接下来,我想到了MM Timer API。 但是这个博客文章说不能完成。 为什么多媒体计时器API(timeSetEvent)不如我所期望的那么精确? 此外,MSDN表示timeSetEvent已过时,我们必须使用CreateTimerQueueTimer API。 http://msdn.microsoft.com/en-us/library/dd757634(v=vs.85).aspx CreateTimerQueueTimer可以解决吗? 或者我需要使用REALTIME_PRIORITY_CLASS过程(我感觉不舒服)?

内核定时器对象和同步

我想知道是否有人可以简单地告诉我(我知道这不是一个简单的主题)如何使用内核计时器对象来同步访问内核中的数据结构? 编辑: 内核定时器对象是内核调度器对象的一部分,调度器对象是内核的同步对象组。 我也想知道定时器对象是线程在能够继续之前必须等待的句柄,还是定时器到期时触发的callback,线程等待处理? 我希望这是有道理的。 内核对我来说是一个新的课题。

如何将整数转换为LARGE_INTEGER

我如何将整数转换为LARGE_INTEGER? 例如,当我想立即触发一个计时器: LARGE_INTEGER zero; zero.QuadPart = 0; KeSetTimer(pTimer, zero, pDpc); 有没有办法将0转换为LARGE_INTEGER? 所以我可以这样做: KeSetTimer(pTimer, (SomeType)0, pDpc); 我努力了: KeSetTimer(pTimer, (LARGE_INTEGER )0, pDpc); 但它不起作用。 我已经Google,但找不到任何帮助。

SetTimer(带callback函数)通过​​启动一个新的线程来工作吗?

以这种方式使用SetTimer : SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL); DoSomethingElse(); 执行立即继续(即它是非阻塞的 , DoSomethingElse()立即执行),但是当这个消息到达 case WM_TIMER: if (wParam == IDT_TIMER_LONGPROCESSING) DoAOneSecondLongJob(); 那么在1秒长的处理期间再次阻塞“窗口消息循环”,导致无响应的接口。 这是SetTimer正常发布计时器消息的行为。 但是我看到SetTimer也可以用第二种方式使用callback函数: VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { DoAOneSecondLongJob(); } // in another function SetTimer(hwnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) MyTimerProc); 题: 这个方法也会被阻塞吗? 要么 它会解决无响应接口的1秒问题吗? 如果是这样,怎么样? 引擎盖下是否有新的线程创build?

使用OS定时器处理游戏循环

一个简单的游戏循环运行如下: MSG msg; while (running){ if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); } else try{ onIdle(); } catch(std::exception& e){ onError(e.what()); close(); } } (来自这个问题 ) 我在这里使用Windows作为例子,它可以是任何平台。 纠正我,如果我错了,但这样一个循环将使用100%的CPU /核心(使用我的电脑一个核心的50%),因为它总是检查runningvariables的状态。 我的问题是,使用操作系统实现游戏循环(在Windows示例中)是否更好(性能方面),根据每秒想要的游戏逻辑的所需刻度数设置所需的时间间隔? 我问这是因为我假设定时器function使用CPU的RTC中断。

定时器运行在Windows窗体中的状态

在Windows窗体中,如何检查计时器是否正在运行或停止?

什么可能会导致OpenGL在“开始debugging”与“不开始debugging”选项下performance不同?

我用C ++编写了一个3D立体OpenGL程序。 我记住我的显示器中的位置对象在timeBeginPeriod(1)之后应该使用timeGetTime。 当我用“开始debugging”运行程序时,我的对象在显示器上平滑移动(他们应该)。 当我通过“Start without debugging”运行程序时,对象会暂时冻结几次屏幕刷新,然后跳转到新的位置。 任何想法可能会导致这个问题,以及如何解决它? 编辑:这似乎可以在短暂的延迟后,当我点击鼠标button时,通过“开始不debugging”运行可以解决急躁。 我的应用程序是一个控制台应用程序(我在程序第一次启动时采取了一些参数)。 这两个选项之间的窗口焦点可能有差异吗? 有没有一种明确的方法强制的焦点到OpenGL窗口(通过glutFullScreen();全屏幕)当我完成从控制台窗口的input? 谢谢。

德尔菲计时器比毫秒更精确

我有一个Delphi程序,它以25赫兹(每秒25次)从外部应用程序获取帧,然后通过创build1-2个额外帧将其转换为60赫兹(每秒60帧)。 我需要通过连续构build一个帧缓冲区并从一个单独的线程输出这里的帧来输出这些额外的帧。 问题是1000/60是16.66667这意味着我不能只在16或17毫秒的“间隔”发送帧,我需要更精确。 如何在Delphi / Windows中执行此操作?