平台:Delphi with VirtualTreeView SVN 5.1.0 & OmniThreadLibrary 3 SVN & Delphi XE2
本来以为是VirtualTreeView的问题。我需要每隔 1 秒或更短的时间将节点添加到 VST。但似乎迟早 CPU 速率会达到 50% 或更多,直到整个应用程序变得完全无响应。
var FAbort:Boolean;
.....
procedure TrmMain.btnAddNodeClick(Sender: TObject);
begin
while not FAbort do
begin
VstMain.RootNodeCount:= VstMain.RootNodeCount + 1;
Sleep(10);
Application.ProcessMessages;
end;
end;
任何人都可以帮忙吗?蒂亚!
编辑:似乎问题来自OTL。使用上面的代码时,将应用程序的 CPU 最小化始终小于 1%,甚至将 10ms sleep 更改为 1ms。
但是,下面的代码将重现困扰我的问题。
procedure TForm1.btn5Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 1 do
CreateTask(
procedure(const Task: IOmniTask)
begin
while not FAbort do
begin
Task.Comm.Send(1, 0);
Sleep(10);
end;
end).OnMessage(
procedure(const Task: IOmniTaskControl; const Msg: TOmniMessage)
begin
vst1.AddChild(nil);
end).Run;
end;
PS:为了避免 OTL 默认的 1000 队列大小泛滥,我在每个线程中都有一个锁,等待添加节点在下一个 Task.Comm.Send 操作之前完成。
PPS:这里的 10ms 只是为了快速重现问题,而不是在实际情况下。所以不要费心问为什么?
好的,结论是:如果您需要定期更新该节点,则不要在单个节点上添加太多节点,节点越多更新它们的cpu时间越多。