Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#17

AW: Ist die Verwendung von TTask so korrekt?

  Alt 2. Jan 2017, 10:31
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat