Zitat von
a.def;1357704[QUOTE:
(von Emba)
Eine weitere Funktionalität von TTask ist das Verhindern der Sperrung der Benutzeroberfläche, wenn Sie im Hintergrund etwas starten möchten. Im folgenden Beispiel wird gezeigt, wie Sie eine einzelne Aufgabe ausführen und starten:
Delphi:
Delphi-Quellcode:
procedure TFormThreading.Button1Click(Sender: TObject);
var
aTask: ITask;
begin
aTask := TTask.Create (procedure ()
begin
sleep (3000); // 3 seconds
ShowMessage ('Hello'); // <= kein Synchronize
end);
aTask.Start;
end;
Ich wage mal zu behaupten, daß das Beispiel dort schlichtweg falsch ist. In den Tiefen von
ShowMessage
wird irgendwann ein
Application.ModalStarted
und ein
Application.ModalEnded
aufgerufen. Darin ist das Verändern von
FModalLevel
schon mal nicht wirklich threadsicher. Weiterhin wird gegebenfalls ein
OnModalBegin
bzw.
OnModalEnd
aufgerufen (auch nicht auf thread-sichere Weise). Sind diese Events verlinkt, wird der dortige Code im Thread-Context aufgerufen, was der Event-Verlinker vermutlich gar nicht auf dem Schirm hat. Das obige Beispiel in einer hinreichend komplexen Anwendung führt zu sporadischen Fehlfunktionen, die nur sehr schwer zu analysieren sind.
Grundsätzlich würde ich mich nicht darauf verlassen, daß der Code in den Beispielen für den produktiven Einsatz geeignet ist. Auch
TTask ist keine Magie, die plötzlich Thread-Programmierung zu einem Kinderspiel macht.
Um den Beispielcode kümmere ich mich noch. Wenn jemand in C++ fit ist, wäre ich für entsprechende Hinweise zu dem dort ebenfalls vorhandenen und potentiell ebenso falschen C++-Code dankbar.