Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Suche Tutorial zum Thema Multithreating (https://www.delphipraxis.net/167985-suche-tutorial-zum-thema-multithreating.html)

WIng2005 29. Apr 2012 00:06

Suche Tutorial zum Thema Multithreating
 
Hallo Gemeinde,

auf der Suche zum Thema Threats bin ich auf das Tutorial auf Delphi-Treff ( http://www.delphi-treff.de/tutorials...ds/einleitung/ )gestoßen, meine jedoch, dass dieses schon ein wenig älter ist. Kennt jemand ggf. aktuellere Tutorials oder kann man mit dem gefundenen erstmal nichts falsch machen?

Besten Dank für eure Hilfe.

Aphton 29. Apr 2012 00:27

AW: Suche Tutorial zum Thema Multithreating
 
Es heißt korrekterweise Threads und nicht Threats (Drohungen) xD

Zur aktuellen Frage - ich habe es gerade überflogen und es scheint Ok zu sein. Lerne mit der TThread Komponente umzugehen. Sollte für den Anfang reichen.

Sir Rufo 29. Apr 2012 01:12

AW: Suche Tutorial zum Thema Multithreating
 
Es kommt auch darauf an, welche Delphi Version du hast - im Profil hast du keine angegeben - denn da hat es kleinere, schickere Veränderungen gegeben.

Vom Grundsatz her, hat sich aber nichts getan, ein Thread ist ein Thread :)

Luckie 29. Apr 2012 02:40

AW: Suche Tutorial zum Thema Multithreating
 
http://michael-puff.de/Programmierung/Delphi/Tutorials/

WIng2005 29. Apr 2012 07:31

AW: Suche Tutorial zum Thema Multithreating
 
Guten Morgen zusammen,

vielen Dank für die Antworten.....
Threats -> Threads -> das erklärt, warum die SuFu nichts ergeben hat. Dumm!
Den Link schaue ich mir mal an...
Nutzen tue ich Delphi XE Starter, der für mich erschwinglichen Version. Das muß ich mal im Profil eintragen...

Besten Dank!

Uwe Raabe 29. Apr 2012 08:44

AW: Suche Tutorial zum Thema Multithreating
 
Zwar auch schon etwas betagt, aber immer noch sehr informativ: Multithreading - The Delphi Way

himitsu 29. Apr 2012 10:28

AW: Suche Tutorial zum Thema Multithreating
 
Was sich verändert hat (in der OH), was aber eigetnlich schon immer hätte gelten dürfen.

Halte niemals einen Thread mit Delphi-Referenz durchsuchenTThread.Suspend an (mit Ausnahme, wenn der Thread suspended erstellt wird).
Und dann mit Delphi-Referenz durchsuchenTThread.Start starten, anstatt mit Delphi-Referenz durchsuchenTThread.Resume. (es geht zwar auch noch mit der alten Methode, der Compiler würde dir dort inzwischen einen Hinweis ausgeben).

Auch die Generics können sehr praktisch sein.

Schau dir am Besten mal alle Methoden und Property von Delphi-Referenz durchsuchenTThread durch, nach etwas was dir gefallen oder für dich praktisch sein könnte.

Delphi-Quellcode:
// dieser Code läuft in irgendeinem Thread
var
  X, Y: string;
begin
  X := 'Hallo';
  TThread.Synchronize(nil, procedure
    begin
      ShowMessage(X);
      InputQuery(Application.Titel, 'gib was ein', Y);
    end;
  MachWas(Y);
end;
Delphi-Quellcode:
// das hier z.B. im MainThread
TThread.CreateAnonymousThread(procedure
  begin
    // das hier läuft jetzt in einem anderem Thread
  end;
// wieder zurück, noch bevor der andere/neue Thread fertig ist

UliBru 29. Apr 2012 11:07

AW: Suche Tutorial zum Thema Multithreating
 
Zitat:

Zitat von himitsu (Beitrag 1164133)
Halte niemals einen Thread mit Delphi-Referenz durchsuchenTThread.Suspend an (mit Ausnahme, wenn der Thread suspended erstellt wird).
Und dann mit Delphi-Referenz durchsuchenTThread.Start starten, anstatt mit Delphi-Referenz durchsuchenTThread.Resume. (es geht zwar auch noch mit der alten Methode, der Compiler würde dir dort inzwischen einen Hinweis ausgeben).

Das ist das, was ich an der Sache sooo liebe. Da wird nun Suspend und Resume als deprecated gekennzeichnet. Nun gut, Start dient als Ersatz für Resume. Was anstelle Suspend genommen werden kann (wenn überhaupt sinnvoll), hat sich mir noch nicht erschlossen.
Und selbst in der neuesten Fassung der Delphi Hilfe wird fleissig weiter mit den alten Aufrufen gearbeitet, siehe z.B. http://docwiki.embarcadero.com/CodeS...y_%28Delphi%29
Es ist nicht einfach, als Neuling in Sachen Threads einzusteigen. Das Tutorial von Luckie weiss leider auch nichts hinsichtlich deprecated

Jens01 29. Apr 2012 11:10

AW: Suche Tutorial zum Thema Multithreating
 
Einmal das vielleicht. Gut für den Einstieg.
Und das vielleicht als Tools.

himitsu 29. Apr 2012 11:18

AW: Suche Tutorial zum Thema Multithreating
 
Es ist ganz einfach, wenn du den Thread von außen anhälst, dann kannst DU nicht sicherstellen, daß der Thread an einer "sicheren" Stellen anhält.

Fazit: Man hält von außen keinen Thread an und somitgibt es keinen Ersatz für Suspend.


Lösung: Du setzt von außen irgendeine (threadsichere) Variable oder ein Event und im Thread baust du einen Code ein, welche darauf hin anhält.
Selbst das Suspend aufruft (besser aber nicht) oder über Sleep+Schleife, bzw. über eine entsprechende WaitFor-Funktion auf das Event wartet.

WIng2005 2. Mai 2012 21:39

AW: Suche Tutorial zum Thema Multithreating
 
Ich denke, ich sollte die Tutorials erstmal lesen......

Vielen Dank für die Links!!

WIng2005 21. Aug 2012 20:56

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:
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.
Das Thread-Objekt:

Delphi-Quellcode:
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.
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:

Delphi-Quellcode:
procedure TTestThread.Execute;
Synchronize(Doanything);
end;
end.

Danke für eure Hilfe!!!

Sir Rufo 21. Aug 2012 21:45

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 :)

WIng2005 21. Aug 2012 21:57

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!!

Sir Rufo 21. Aug 2012 22:02

AW: Suche Tutorial zum Thema Multithreating
 
Zitat:

Zitat von WIng2005 (Beitrag 1179164)
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!!

Äh ja, genau das macht Synchronize ja auch, beide Threads laufen synchron (im Kontext des MainThreads) ;)

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.

WIng2005 21. Aug 2012 22:20

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 ;)

Medium 21. Aug 2012 23:21

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.

Uwe Raabe 22. Aug 2012 09:55

AW: Suche Tutorial zum Thema Multithreating
 
Zitat:

Zitat von WIng2005 (Beitrag 1179173)
Ich kann leider grad die Online-Hilfe nicht nutzen, da ich diese wohl nicht installiert habe (Rechner ist frisch aufgesetzt).

http://docwiki.embarcadero.com/RADStudio/de/Hauptseite

WIng2005 23. Aug 2012 20:01

AW: Suche Tutorial zum Thema Multithreating
 
Ok, habe mal ein wenig experimentiert....denke, ich habs verstanden.. :)

Danke an alle!!

himitsu 23. Aug 2012 20:47

AW: Suche Tutorial zum Thema Multithreating
 
Zitat:

Zitat von WIng2005 (Beitrag 1179173)
Ich kann leider grad die Online-Hilfe nicht nutzen, da ich diese wohl nicht installiert habe (Rechner ist frisch aufgesetzt).

Die läßt sich doch schnell installieren. :angle2:

PS: Schau mal auf der DP-Startseite auf die rechte Seite ... Nachschlagewerke :zwinker:

WIng2005 23. Aug 2012 21:03

AW: Suche Tutorial zum Thema Multithreating
 
Wieder was gelernt, danke!!
Das mit der Installation der Hilfe muss warten, bis ich das nächste Backup mache. Dann ist sie dabei ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz