AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suche Tutorial zum Thema Multithreating

Ein Thema von WIng2005 · begonnen am 29. Apr 2012 · letzter Beitrag vom 23. Aug 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.377 Beiträge
 
Delphi 12 Athens
 
#1

AW: Suche Tutorial zum Thema Multithreating

  Alt 29. Apr 2012, 11:18
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#2

AW: Suche Tutorial zum Thema Multithreating

  Alt 2. Mai 2012, 21:39
Ich denke, ich sollte die Tutorials erstmal lesen......

Vielen Dank für die Links!!
MFG
Steffen
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#3

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 20:56
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!!!
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 21:45
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#5

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 21:57
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!!
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 22:02
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#7

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 22:20
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
MFG
Steffen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 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