问题描述
此查询的目的是我将 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 (将#修改为@)