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


{ TMyThread }

procedure TMyThread.Execute;
begin
  // Hier möchte ich aktion aufrufen
end;


{ TMyButton }


constructor TMyButton.Create(AOwner: TComponent);
begin
  inherited;
  FThread := TMyThread.Create (true);
end;

procedure TMyButton.aktion;
begin
  // irgendwas
end;


end.


jaenicke - Di 14.12.10 12:35

user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Übergib stattdessen einfach dem Konstruktor die zur Initialisierung notwendigen Daten (auch die Instanz der Komponente selbst, also Self). :idea:


cool - Danke!