![]() |
AW: Suche Tutorial zum Thema Multithreating
Ich denke, ich sollte die Tutorials erstmal lesen......
Vielen Dank für die Links!! |
AW: Suche Tutorial zum Thema Multithreating
Soooo, ich hatte nun im Urlaub mal ein wenig Zeit, um mal wieder etwas für mein Projekt zu tun. Dabei wollte ich mich auch mit der Thematik der Threads befassen. Idealerweise liefert Delphi hier ja ein kleines Beispiel, welches ich zum besseren Verständis mal ein wenig gekürzt habe:
Es handelt sich um eine Form, mit 2 Buttons. Button1 startet bzw. erzeugt einen neuen Thread, Button2 Zeigt ein Nachrichtenfenster:
Delphi-Quellcode:
Das Thread-Objekt:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure ThreadDone(Sender: TObject); public end; var Form1: TForm1; implementation uses unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin with TTestThread.Create() do OnTerminate := ThreadDone; showmessage('Button1Click'); end; procedure TForm1.Button2Click(Sender: TObject); begin showmessage('Event'); end; procedure TForm1.FormCreate(Sender: TObject); begin // end; procedure TForm1.ThreadDone(Sender: TObject); begin showmessage('Thread done!'); end; end.
Delphi-Quellcode:
Mein Verständnis hierzu ist nun, dass Button2 unabhängig von Button1 immer reagiert, also die Message 'Event' angezeigt wird. Dazu hätte ich erwartet, dass 'Button1Click' vor Beenden des Threads angezeigt wird. Tatsächlich reagiert solang die Schleifen laufen die Form nicht und keine der 2 Meldungen erscheint. Kann mir jemand erklären, wo mein Denkfehler dabei liegt? Ebenfalls würde mich interesseiren, ob ich die Methode doanything auch direkt aus der execute-Methode aufrufen kann (im Sort-Beispiel wird dieser "Umweg" gegangen...), also:
unit Unit2;
interface uses Classes; type TTestThread = class(TThread) private procedure doanything(); protected procedure Execute; override; procedure anything; public constructor Create(); end; implementation constructor TTestThread.Create(); begin inherited Create(False); end; procedure TTestThread.doanything; var r,x,y,z:integer; begin r:=0; for x:=1 to 1000 do for y:=1 to 1000 do for z:= 1 to 1000 do r:=r+z; end; procedure TTestThread.anything; var x,y:integer; begin Synchronize(Doanything); end; procedure TTestThread.Execute; begin anything; end; end.
Delphi-Quellcode:
procedure TTestThread.Execute;
Synchronize(Doanything); end; end. Danke für eure Hilfe!!! |
AW: Suche Tutorial zum Thema Multithreating
Schau mal in die OH, was Synchronize bewirkt ;)
Ok, hier mal schnell in kurz: Die Methode wird im Kontext des MainThread ausgeführt - also von der VCL -> dem Formular. Somit wird der aktive Teil in deinem Thread so ausgeführt, als ob ob der gar nicht in einem eigenen Threadkontext läuft. Somit ist es nur verständlich, dass die Form nicht reagiert, bis der "Thread" fertig ist. Lass das Synchronzie weg und alles wird gut :) |
AW: Suche Tutorial zum Thema Multithreating
Mmmmh, dumm. Ich hatte Synchronize dahingehend interpretiert, dass ich von meinem Thread auf den VCL-Thread zugreifen kann, beide sich eben synchronisieren.
Im Sort-Beispiel werden aber 3 Threads parallel ausgeführt und ändern die Form....das sollte der Unterschied sein.... Falsche Denke....Dankeschön!! |
AW: Suche Tutorial zum Thema Multithreating
Zitat:
Allerdings solltest du nur dann synchronisieren, wenn du etwas dem MainThread mitzuteilen hast, und zwar nur dann. Wenn du auf die Fertigstellung der Übergabe an den MainThread warten musst, dann kannst du auch Queue benutzen, der Thread läuft dann direkt weiter. Aber, die Berechnungen sollten im Thread laufen und nur die Interaktion (Ausgaben/Abfragen) mit dem MainThread per Synchronize/Queue. |
AW: Suche Tutorial zum Thema Multithreating
Hallo und danke für deine Hilfe,
aber spricht das in meinem Bsp. dann nicht doch fürs synchronisieren? Sofern ich bspw. ein Edit-Feld beschreibe, greife ich ja direkt auf den MainThread zu. Ich kann leider grad die Online-Hilfe nicht nutzen, da ich diese wohl nicht installiert habe (Rechner ist frisch aufgesetzt). Hab mal gegoogelt und mir was als "Nachtlektüre" ausgedruckt....mal sehen, obs hilft ;) |
AW: Suche Tutorial zum Thema Multithreating
Gegen das Synchronize in diesem Beispiel spricht, dass du in deiner 3-fach Schleife nirgends auf Komponenten des Formulars zugreifst. Idealerweise synchronisiert man nur die paar Zeilen, die auch wirklich Eigenschaften von Komponenten direkt verändern. Da dies in deinem Thread-Code an keiner Stelle der Fall ist, brauchst du es überhaupt nicht.
Alles, was in Synchronized() passiert, läuft so ab, als würdest du es einfach ganz normal als Prozedur ohne Thread irgendwo im Programm ausführen. Insbesondere blockiert es die Message-Handler, weswegen so auch nichts reagiert. Ganz so, als würde man es ohne Thread machen. Wenn man sämtlichen Code eines Threads (alles was im Execute() passiert) synchronisiert, hat der Thread keine Daseinsberechtigung mehr. |
AW: Suche Tutorial zum Thema Multithreating
Zitat:
![]() |
AW: Suche Tutorial zum Thema Multithreating
Ok, habe mal ein wenig experimentiert....denke, ich habs verstanden.. :)
Danke an alle!! |
AW: Suche Tutorial zum Thema Multithreating
Zitat:
PS: Schau mal auf der DP-Startseite auf die rechte Seite ... Nachschlagewerke :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz