procedure TCustomGridViewCameraDoc.InitSchedule; begin Scheduler.Schedule( procedure(const AScheduledEvent:IkbmMWScheduledEvent) begin ... AScheduledEvent.Terminate; //必须 .SyncQueued end).EverySecond(1).Synchronized.NamedAs(‘se_job1‘) end;
上面的代码出问题了,当调用AScheduledEvent.Terminate,应用卡死!
换一种写法,测试正常:
procedure TCustomGridViewCameraDoc.InitSchedule; begin se_job1 := Scheduler.Schedule( procedure(const AScheduledEvent:IkbmMWScheduledEvent) begin ... AScheduledEvent.Terminate;//卡死了! end).EverySecond(1) .SyncQueued//Synchronized换成SyncQueued .NamedAs(‘se_job1‘) end;
或者这样写,也正常:
procedure TCustomGridViewCameraDoc.InitSchedule; begin se_job1 := Scheduler.Schedule( procedure(const AScheduledEvent:IkbmMWScheduledEvent) begin TThread.Synchronize(nil,procedure begin ....; end);//这样同步主线程执行逻辑 AScheduledEvent.Terminate; end).EverySecond(1).NamedAs(‘se_job1‘) end;
算不算是bug呢?我也说不清了。
原文:https://www.cnblogs.com/kinglandsoft/p/12372855.html