如何在 Linux 上实现 Windows 函数“CreateWaitableTimer”和“SetWaitableTimer”?在 Linux 上是否有任何等效的替代品?

问题描述

此查询的目的是我将 Windows 调用移植到 Linux。 以下是我的应用程序中有关如何使用 Windows API 的一段代码: CreateWaitableTimer() 和 SetWaitableTimer()

procedure WorkerExecute;
var
  Timer : THandle;
  WaitArray : array[0..1] of THandle;
  nextSchedule : integer;
  timeToSchedule : Int64;
begin
  try
    TlsSetValue(WorkerThreadTls,Pointer(self));
    Timer := CreateWaitableTimer(nil,true,nil);
    WaitArray[0] := Timer;
    WaitArray[1] := DispatchTrigger;
    nextSchedule := 0;
    while not Terminated do begin
      if nextSchedule > 0 then begin
        timeToSchedule := -10000 * nextSchedule; 
        SetWaitableTimer(Timer,timeToSchedule,nil,false);
        AtomicIncrement(SleepingWorkers);  
        if MsgWait then
          MsgWaitForMultipleObjects(2,WaitArray,false,INFINITE,QS_ALLINPUT)
        else
          WaitForMultipleObjects(2,@WaitArray,INFINITE);
           AtomicDecrement(SleepingWorkers)       
      end;
      nextSchedule := 100; // default: sleep 100 ms
      if SlaveWorker <> nil then begin
        // extra work for MainWorker
        if Sim.State = isStartInitialize then begin
          try
            Sim.InitializeLayers
          finally
            Sim.State := isInitialized
          end
        end;
        if Sim.State = isStartShutdownLayers then begin
          Sim.State := isShuttingDownLayers;
          Sim.ShutdownLayers
        end
      end;
      Sim.DispatchEvents(nextSchedule)
    end;
    CloseHandle(Timer);
    TlsSetValue(WorkerThreadTls,nil)
  except
    HandleException(self)
  end
end;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)