Autor Beitrag
Daniel L.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Di 14.12.10 12:33 
Ich dache, ich ruf den Thread innerhalb meiner Komponente auf. (?)
Hier als Code beispielhaft dargestellt
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 12:35 
user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: 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!