AGB  ·  Datenschutz  ·  Impressum  







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

TThread und Rückgabe an Formular

Ein Thema von tofse · begonnen am 19. Jun 2014 · letzter Beitrag vom 19. Jun 2014
Antwort Antwort
mjustin

Registriert seit: 14. Apr 2008
3.013 Beiträge
 
Delphi 2009 Professional
 
#1

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 10:27
Mit synchronize funktioniert das ja, aber in verschiedenen Tutorials habe ich gelesen, dass man das nicht machen würde. Das wäre ja pro Schleifendurchlauf im Thread ein Aufruf von synchronize, der jedesmal den Thread kurz unterbrechen würde.
Neuere Delphi Versionen enthalten die Methode TThread.Queue, die im Unterschied zu Synchronize den Thread nicht sofort blockiert (sondern erst zu einem späteren Zeitpunkt). Queue legt den eigenen Methodenaufruf in eine Warteschlange und gibt die Kontrolle sofort an den Thread zurück. Im Haupthread wird dann "später" diese Queue abgearbeitet. Eine Garantie dafür gibt es aber nicht, z.B. falls beim Beenden des Programms noch Einträge in dieser Queue sind.
Michael Justin
  Mit Zitat antworten Zitat
Mschmidt

Registriert seit: 4. Jul 2010
Ort: Berlin
62 Beiträge
 
Delphi XE2 Professional
 
#2

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 12:53
Ich verwende dazu Methodenaufrufe:

Delphi-Quellcode:
type
  TMainProc = procedure (<Parameter>) of object;

type
  TMain = Class(TForm)
...
  procedure Aktualisiere(<Parameter>);
...
  procedure StartThread;
end;

Type
  TMeinThread = Class(TThread)
  fMainProc :TMainProc;
  procedure Execute;
  constructor Create(MainProc:TMainProc);
end;

Constructor TMeinThread.Create;
begin
  ...
  fMainProc:= MainProc;
...
end;

procedure TMeinThread.Execute;
begin
  while not terminated do begin
  if (<Zähler>) and (assigned(fMainProc)) then
    synchronize ( begin fMainProc(<Parameter>)end;); // anonyme Methode
  ...
end;

procedure TMain.StartThread;
begin
  TMeinThread.create(Aktualisiere);
  ...
end;

procedure TMain.Aktualisiere(<Parameter>);
begin
  // dieser code wird aus dem Thread aufgerufen
...
end;
grüsse Mschmidt
  Mit Zitat antworten Zitat
tofse

Registriert seit: 6. Jun 2011
Ort: Saarlouis
131 Beiträge
 
Delphi XE Professional
 
#3

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 16:46
Hallo,

vielen Dank für die vielen Tipps.
Zu meiner Frage bzgl. Events hat sich noch niemand geäußert.
Ich habe es mal so versucht:

TCopyErrorEvent = procedure(Sender: TObject;Datei:String;Fehler:String) of Object; Das hat funktioniert.
Nur wie gesagt, im Netz habe ich zu dieser Möglichkeit, Rückmeldung ans Formular zu geben, gar nichts gefunden. Deshalb: macht man das nicht, aus irgendeinen Grund, wie Performance oder hängt der Thread dann auch kurz?

Danke
  Mit Zitat antworten Zitat
Mschmidt

Registriert seit: 4. Jul 2010
Ort: Berlin
62 Beiträge
 
Delphi XE2 Professional
 
#4

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 16:51
Selbstverständlich macht man das, ansonsten wäre ja die methode synchronize obsolet,oder?
Dem thread ist das letztendlich egal. Das gibt auch keine Fehler oder sonst was, es sei den, du baust falsch....
Cheers mschmidt
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.494 Beiträge
 
Delphi 12 Athens
 
#5

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 17:12
Events so wie du sie verwendest, dürfen vom Thread nur mit Synchronize aufgerufen werden.
Synchronize bedeuted, der Thread muss Anhalten, wenn der Hauptthread mal nichts zu tun hat führt er das Event aus, danach wird der Thread wieder aufgeweckt.

Der Vorschlag mit Postmessage ist da deutlich besser.
  Mit Zitat antworten Zitat
tofse

Registriert seit: 6. Jun 2011
Ort: Saarlouis
131 Beiträge
 
Delphi XE Professional
 
#6

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 17:23
Ah, ok, habs verstanden.

Danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 17:30
Events so wie du sie verwendest, dürfen vom Thread nur mit Synchronize aufgerufen werden.
Synchronize bedeuted, der Thread muss Anhalten, wenn der Hauptthread mal nichts zu tun hat führt er das Event aus, danach wird der Thread wieder aufgeweckt.

Der Vorschlag mit Postmessage ist da deutlich besser.
Nja, der Vergleich hinkt etwas.

Also, grundsätzlich dürfen Zugriffe auf die VCL (Delphi-GUI) nur aus dem Hauptthread erfolgen.
Synchronize nimmt die Funktion und führt sie im Hauptthread aus, wobei das natürlich so lange warten muß, bis der Haupthtead mal Zeit und Lust dafür hat.
Synchronize wartet mit der Ausführung, bis die übergebene Funktion fertig ist und erst dann läuft der Thread weiter.

Queue übergibt das auch an den Hauptthread, genau wie Synchronize, nur kehrt das sofort zurück und lässt den thread weiterarbeiten. Der Hauptthread führt aber auch da die Prozedur erst dann aus, wenn er kann.

Delphi-Referenz durchsuchenTThread.Synchronize -> MSDN-Library durchsuchenSendMessage
Delphi-Referenz durchsuchenTThread.Queue -> MSDN-Library durchsuchenPostMessage

Wenn du also das Synchronize-Equivalent "SendMessage" verwendet hättest, dann würde der Thread ebenfalls warten müssen, bis die Message verarbeitet wurde.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 20:50
Und ja, natürlich ist es auch nicht unbedingt nötig, ALLES in der GUI anzuzeigen.
  • entweder die Schleife im Thread ist so langsam, daß durchschnittlich nahezu nie mehr als 5 bis 10 Aktualisierungen der GUI auftreten, bzw. daß die Anzahl der Aktualisierungen nicht grade in die Tausende gehen.
    Wenn nicht, dann kann man sich auch getrost alles sparen, garnichts unternehmen und einfach alles anzeigen.
  • oder man zeigt einfach immer blind nur z.B. jede 100-ste Meldung an
  • oder (was ich gern mache, da es unabhängig von der Rechen-/Arbeitsleistung ist) du zeigst nur meldungen an, wenn seit der letzen Anzeige mindestens 100 oder 250 Millisekunden vergangen sind > GetTickCount)
  • oder der Thread gibt garnichts an die GUI weiter, sondern da läuft z.B. ein Timmer (vielleicht alle 100, 250, 1000 oder x Millisekunden) und die GUI holt sich die aktuelle Position, wenn sie Lust und Zeit dazu hat
  • ...
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.165 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TThread und Rückgabe an Formular

  Alt 19. Jun 2014, 20:24
Nur wie gesagt, im Netz habe ich zu dieser Möglichkeit, Rückmeldung ans Formular zu geben, gar nichts gefunden.
Hast Du meinen Post gelesen?
  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 00:22 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