| Autor |
Beitrag |
Daniel L.
      
Beiträge: 140
Erhaltene Danke: 14
W7, W8
TurboD Prof, Delphi Community
|
Verfasst: Di 14.12.10 11:58
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
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. 
      
Beiträge: 140
Erhaltene Danke: 14
W7, W8
TurboD Prof, Delphi Community
|
Verfasst: Di 14.12.10 12:33
Ich dache, ich ruf den Thread innerhalb meiner Komponente auf. (?)
Hier als Code beispielhaft dargestellt
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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).
// 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. 
      
Beiträge: 140
Erhaltene Danke: 14
W7, W8
TurboD Prof, Delphi Community
|
Verfasst: Di 14.12.10 13:38
|
|
|