Erstellen einer VCL-Formularanwendung, setzen Sie ein TButton und TMemo auf dem Formular, und schreiben Sie diesen Code in der OnClick-Handler-Taste:Hauptgewinde blockiert paralleles Gewinde?
uses
OtlParallel, OtlTaskControl;
procedure TForm2.btnStartLoopClick(Sender: TObject);
var
starttime: Cardinal;
k: Integer;
begin
mmoTest.Lines.Clear;
for k := 1 to 50 do
mmoTest.Lines.Add('Line ' + IntToStr(k));
starttime := GetTickCount;
Parallel.Async(
procedure
var
i: Integer;
begin
for i := 1 to 50 do
begin
Sleep(100);
mmoTest.Lines[i - 1] := mmoTest.Lines[i - 1] + FormatDateTime(' nn:ss:zzz', Now);
end;
end,
Parallel.TaskConfig.SetPriority(TOTLThreadPriority.tpHighest).OnTerminated(
procedure
begin
mmoTest.Lines.Add(IntToStr(GetTickCount - starttime) + ' milliseconds');
end));
end;
nun das Programm ausführen und diesen Test machen:
Klicken Sie auf die Schaltfläche, warten Sie einfach, bis die Schleife abgeschlossen ist, und sehen Sie sich die Zeit an, die in der letzten Zeile des Memos angezeigt wird: Sie sollte ungefähr 5300 Millisekunden betragen.
Klicken Sie erneut auf die Schaltfläche, klicken und halten Sie die Titelleiste des Formulars und verschieben Sie das Formular schnell, bis die Schleife beendet ist. Sehen Sie sich noch einmal die letzte Zeile des Memos an: In meinen Tests lag die Zeit bei über 7000 Millisekunden. Offensichtlich blockiert der Hauptfaden den parallelen Faden!
Wie also kann der Haupt-Thread die parallelen Gewinde vermieden werden blockiert?
- "Offensichtlich, ..." - Warum? Zuerst würde ich einen Test vorschlagen, dass Sie ein Programm zur Überwachung der CPU-Auslastung öffnen und dann die Titelleiste eines Fensters halten und sich schnell bewegen, während Sie beobachten, wie sich dies auf die CPU-Nutzung auswirkt. Wenn es etwas Bedeutendes ist, dann ist deine Annahme strittig. –
Remy, könnten Sie ein kleines Codebeispiel geben? – user1580348