プラットフォーム: VirtualTreeView SVN 5.1.0 & OmniThreadLibrary 3 SVN & Delphi XE2 を搭載した Delphi
もともと問題は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 のスリープを 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: ここでの 10 ミリ秒は、実際の状況ではなく、問題をすばやく再現するためのものです。では、わざわざ理由を尋ねないでください。
OK、結論は次のとおりです。このノードを定期的に更新する必要がある場合は、単一ノードにノードを追加しすぎないでください。ノードが多いほど、それらを更新するためのCPU時間が長くなります。