同じジョブを実行するマルチスレッドコードの2つの方法があります。TThreadより遅いTTask
TTask:
const
MaxThreadCount = 80;
procedure TWorkerTask.Update;
var
aTasks : array of ITask;
I: Integer;
begin
Stopwatch := TStopwatch.StartNew;
SetLength(aTasks, MaxThreadCount);
for I := Low(aTasks) to High(aTasks) do begin
aTasks[I] := TTask.Create(procedure
begin
Writeln('Thread ', TTask.CurrentTask.Id, ' Stared');
Sleep(5000);
Writeln('Thread ', TTask.CurrentTask.Id, ' Finshed');
end);
aTasks[I].Start;
end;
TTask.WaitForAll(aTasks);
Elapsed := Stopwatch.Elapsed;
Writeln('Done in ', Round(Elapsed.TotalSeconds));
end;
出力例えばDone in 29
のTThread:
const
MaxThreadCount = 80;
procedure TWorker.Execute;
begin
Writeln('Thread ', ThreadID, ' Stared');
Sleep(5000);
Writeln('Thread ', ThreadID, ' Finshed');
end;
....
var
Workers : array of TWorker;
I : Integer;
Stopwatch : TStopwatch;
Elapsed : TTimeSpan;
begin
SetLength(Workers, MaxThreadCount);
for I := Low(Workers) to High(Workers) do begin
Workers[I] := TWorker.Create;
Workers[I].Start;
end;
for I := Low(Workers) to High(Workers) do
Workers[I].WaitFor;
Elapsed := Stopwatch.Elapsed;
Writeln('Done ', Round(Elapsed.TotalSeconds));
出力例えばDone 8
Q:TTaskは上TThreadクラスより極端に遅いのはなぜ上記の方法?同様の結果を得るためにスピードアップする方法はありますか?
出力がコードと一致しません。 *実際の出力とは何ですか? –
@RemyLebeauの出力が編集されました – RepeatUntil
@RepeatUntilもしあなたがそれを使用しないなら、 'Writeln( 'Thread'、ThreadID、 'Stared');などをコーディングするのは何ですか?注:これらの行の出力は、何が起こっているのかを理解するのに役立ちます(特に出力にタイムスタンプを含める場合)。 –