Платформа: Delphi с VirtualTreeView SVN 5.1.0 и OmniThreadLibrary 3 SVN и Delphi XE2
Изначально я думал, что проблема в VirtualTreeView. Мне нужно добавлять узел в VST каждую 1 секунду или реже. Но, похоже, рано или поздно скорость ЦП достигнет 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. При использовании приведенного выше кода минимизируйте нагрузку ЦП приложения всегда менее чем на 1%, даже измените спящий режим с 10 мс на 1 мс.
Но приведенный ниже код воспроизводит проблему, которая меня беспокоит.
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: 10 мс здесь только для быстрого воспроизведения проблемы, а не в реальной ситуации. Так что не трудитесь спрашивать, почему?
Хорошо, вывод таков: просто не добавляйте слишком много узлов на один узел, если вам нужно периодически обновлять этот узел, чем больше узлов, тем больше времени процессора для их обновления.