Платформа: Delphi с VirtualTreeView SVN 5.1.0 & OmniThreadLibrary 3 SVN & Delphi XE2
Първоначално мислех, че проблемът е VirtualTreeView. Трябва да добавя възел към VST на всеки 1s или по-малко. Но изглежда скоро или късно скоростта на процесора ще достигне 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;
Някой може ли да помогне? TIA!
РЕДАКТИРАНЕ: Изглежда, че проблемът идва от OTL. Когато използвате кода по-горе, минимизирайте приложението, процесорът винаги е по-малко от 1%, дори променете 10ms заспиване на 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 тук са само за бързо възпроизвеждане на проблема, а не в реална ситуация. Така че не си правете труда да питате защо?
Добре, заключението е: просто не добавяйте твърде много възли към един възел, ако трябва периодично да актуализирате този възел, колкото повече възли, толкова повече време на процесора за актуализирането им.