Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente mit Thread entwickeln
Daniel L. - Di 14.12.10 11:58
Titel: Komponente mit Thread entwickeln
Hallo zusammen,
ich erstelle eine eigene Komponenete, in der u.a. ein neuer Thread abgespalten werden soll, der dann in seiner Execute-Methode auf Methoden meiner Komponente zugreifen soll.
Das Problem ist, das der Thread ja selbst eine eigene Klasse ist, und ich von dort aus nicht auf die Methoden meiner Komponente zugreigen kann, da es ja noch keine Instanz meiner Komponenete gibt.
Danke schon mal für eure Hilfe,
Daniel
jaenicke - Di 14.12.10 12:06
In dem Moment, in dem du den Thread startest, musst du doch die Komponente schon haben. Woher soll sonst der Aufruf des Threads kommen? :shock:
Diese Instanz kannst du dann mitgeben. Du musst aber aufpassen, dass du die Zugriffe aus dem Thread richtig synchronisierst. Und dass dabei kein Deadlock entstehen kann, wenn andere Teile der Anwendung ebenfalls Threads benutzen. (Sowas passiert z.B. bei den Indy-Komponenten bei falscher Nutzung leicht.)
Daniel L. - Di 14.12.10 12:33
Ich dache, ich ruf den Thread innerhalb meiner Komponente auf. (?)
Hier als Code beispielhaft dargestellt
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| unit NeuButton;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TMyThread = class(TThread) protected procedure Execute; override; end;
TMyButton = class (TButton) public FThread : TMyThread; constructor Create(AOwner: TComponent); procedure aktion; end;
implementation
procedure TMyThread.Execute; begin end;
constructor TMyButton.Create(AOwner: TComponent); begin inherited; FThread := TMyThread.Create (true); end;
procedure TMyButton.aktion; begin end;
end. |
jaenicke - Di 14.12.10 12:35
Daniel L. hat folgendes geschrieben : |
Delphi-Quelltext 1:
| FThread := TMyThread.Create (true); | |
Das fängt schon einmal schlecht an. Suspended erzeugen und dann Resume benutzen kann schwere Probleme verursachen, wenn man nicht ganz genau weiß was man tut.
Übergib stattdessen einfach dem Konstruktor die zur Initialisierung notwendigen Daten (auch die Instanz der Komponente selbst, also Self). :idea:
// EDIT:
Nebenbei würde ich dort auch noch auf
csDesigning in ComponentState prüfen, damit der Thread nicht gestartet wird, wenn das Formular in der IDE erzeugt wird (es sei denn du willst das).
Daniel L. - Di 14.12.10 13:38
jaenicke hat folgendes geschrieben : |
Übergib stattdessen einfach dem Konstruktor die zur Initialisierung notwendigen Daten (auch die Instanz der Komponente selbst, also Self). :idea:
|
cool - Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!