多线程 – 如何将此时间关键程序优先于其他线程?

为了编写一个MIDI音序器,我需要一个稳定的脉冲,它调用一个时序例程,该例程具有绝对优先于程序中的任何其他内容,并且优先于计算机中的任何内容.我通过使用TimeSetEvent这样做:

TimeSetEvent (FInterval, 0, TimerUpdate, uInt32 (Self), TIME_PERIODIC);

其中TimerUpdate是一个回调函数,它恢复一个优先级为tpTimeCritical的独立线程,并调用一个例程(FOnTimer)来处理所有MIDI事件.

procedure TThreaded_Timer.Execute;
begin
   if Assigned (FOnTimer) then
   begin
      while not Terminated do
      begin
         FOnTimer (Self);
         if not Terminated then Suspend;
      end; // while
   end; // if
   Terminate;
end; // Execute //

虽然这种结构比我之前尝试的一些东西要好得多,但它仍然对某些事件非常敏感.令我惊讶的是,每次显示提示都会出现断断续续的情况.为什么简单的提示会导致时间关键线程中断?当然我可以把它关掉,但哪些令人讨厌的惊喜还在等着我?

最佳答案
多媒体计时器的准确性不是很好..Here是一篇解释原因的文章.

而不是依靠计时器来唤醒你的线程为什么你不在线程本身内管理你的睡眠和唤醒时间?

也许是这样的(伪代码,对不起,我不知道Delphi):

my_critical_thread()
{
    while (true) {
        time = get_current_time()
        do_work();
        time = interval - (get_current_time() - time)
        if (time > 0)
            sleep(time)
    }
}

如果线程设置为关键优先级,这应该使您非常接近目标间隔,假设您在每次迭代时所做的工作为您的其他线程和系统的其余部分留出时间来完成它们的工作.

祝好运.

转载注明原文:多线程 – 如何将此时间关键程序优先于其他线程? - 代码日志