Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstruktor Thread - Frage (https://www.delphipraxis.net/108479-konstruktor-thread-frage.html)

pronny31 14. Feb 2008 12:20


Konstruktor Thread - Frage
 
Hallo,
habe folgendes Problem :
Ich möchte aus einem Formular heraus einen oder mehere Threads erzeugen !
Diesen Thread möchte ich Werte und Elemente aus meinem Formular übergeben und anschließend wieder
zuweisen !

Mein Ansatz war nun folgender :
Ich habe eine neue Klasse erzeugt welche von Thread abgeleitet ist

Delphi-Quellcode:
Thread_Auswertung = class(TThread)
  Label1             : TLabel;
  IBDatabase_fenster : TIBDatabase;
  IBTransaction1     : TIBTransaction;
  IBQuery1           : TIBQuery;

  private
  { Private-Deklarationen }

  public
   
    constructor Create(CreateSuspended: Boolean ;Label_uebegabe : TLabel;IBDatabase1: TIBDatabase);overload;

  protected
    procedure   Execute; override;
  end;
Jetzt wollte ich den Konstruktor implementieren :
Delphi-Quellcode:
constructor TThread.Create(CreateSuspended: Boolean ;Label_uebegabe : TLabel;IBDatabase1: TIBDatabase);
var
  Flags: DWORD;
begin
  inherited Create;
  AddThread;
  FSuspended := CreateSuspended;
  Flags := 0;
  if CreateSuspended then Flags := CREATE_SUSPENDED;
  FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;
Mein Problem ist nun folgendes ... er kann die Prrozeduren addThread , FSuspended usw. nicht finden (Undefinierter Bezeichner) !

Kroko1999 14. Feb 2008 12:23

Re: Konstruktor Thread - Frage
 
wie sollte er, Du hast diese Variablen doch gar nicht definiert

pronny31 14. Feb 2008 12:24

Re: Konstruktor Thread - Frage
 
Die wurden doch vererbt !!!!!

SirThornberry 14. Feb 2008 12:25

Re: Konstruktor Thread - Frage
 
Da ich gerade Labels etc. sehe in dem Thread denke ich das es angebracht ist dich darauf hinzuweisen das du nicht vom Thread aus auf das Label zugreifen solltest. Die gilt für nahezu alle VCL objekte da diese nicht Threadsafe sind.

fSuspended sollte er auch nicht finden. Das f deutet ja darauf hinn das es sich um ein Feld handelt und das sollte doch nur durch die entsprechenden Methoden änderbar sein.

Muetze1 14. Feb 2008 12:27

Re: Konstruktor Thread - Frage
 
Zitat:

Zitat von pronny31
Die wurden doch vererbt !!!!!

Von TThread? Und wo sind diese definiert in TThread? Richtig, im private Abschnitt. Und was bedeuten diese Schlüsselwörter im OOP?

Du hast die Eigenschaft Suspended und wozu du AddThread brauchen solltest, ist mir ein Rätsel. Schon allein da das inherited den originalen Constructor mit dem Aufruf schon ausführt.

pronny31 14. Feb 2008 12:28

Re: Konstruktor Thread - Frage
 
Wie kann ich vom Thread aus Auf die Variablen zugreifen z.B. eine Anzeige im Fenster das der Thread läuft oder so .....

DeddyH 14. Feb 2008 12:29

Re: Konstruktor Thread - Frage
 
Such mal nach Synchronize.

Muetze1 14. Feb 2008 12:29

Re: Konstruktor Thread - Frage
 
Zitat:

Zitat von pronny31
Wie kann ich vom Thread aus Auf die Variablen zugreifen z.B. eine Anzeige im Fenster das der Thread läuft oder so .....

Bau dir eine Methode und rufe diese über Delphi-Referenz durchsuchenSynchronize im Thread auf. Wenn du dies aber öfters machst, dann ist der ganze Vorteil von einem Thread dahin.

/EDIT: roter Kasten?

pronny31 14. Feb 2008 12:37

Re: Konstruktor Thread - Frage
 
Ich brauche aber die Daten einer Komponente aus dem Hauptthread ! Wie bekomme ich Daten vom HauptThread an den CHildThread ......

shmia 14. Feb 2008 12:39

Re: Konstruktor Thread - Frage
 
Delphi-Quellcode:
// FALSCH ! deine Klasse heisst Thread_Auswertung und nicht TThread
constructor TThread.Create(CreateSuspended: Boolean ;Label_uebegabe : TLabel;IBDatabase1: TIBDatabase);
            ^^^^^^^
...
begin
  inherited Create;

  // FALSCH ! Finger weg von Window-API Funktionen für Thread
  // das managed alles schon die Basis-Klasse TThread
  // du musst nur die Execute-Methode überschreiben

  // FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;

Muetze1 14. Feb 2008 12:42

Re: Konstruktor Thread - Frage
 
Ich sehe hier als Hauptproblem das hier noch so manche Lücken in der objektorientierten Programmierung sind. Grundsätzlich ist das Verständnis noch nicht da, ansonsten hätte sich hier schon so manches Problem geklärt gehabt.

pronny31 14. Feb 2008 13:29

Re: Konstruktor Thread - Frage
 
Mit synchronize kann ich aber nicht innerhalb des Childthreads auf Komponenenten des Formulars zugreifen !
Wie bekomme ich das hin ?

Muetze1 14. Feb 2008 13:43

Re: Konstruktor Thread - Frage
 
Erstmal: Deine Aufrufezeichen k*tzen mich an. Die lassen deine Beiträge so rüberkommen wie ein bockiges Kind was immer nur haben will...

Zum anderen: wie kommst du zu deiner Aussage? Schonmal die Hilfe zu Synchronize konsultiert? Warum solltest du in der durch Synchronize aufgerufenen Methode nicht auf diese Komponenten zugreifen können? Zeige doch mal deinen bisherigen Code in dem du es versuchst.

pronny31 14. Feb 2008 14:01

Re: Konstruktor Thread - Frage
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, Db, IBCustomDataSet, IBQuery, IBDatabase;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Panel4: TPanel;
    Panel5: TPanel;
    Label3: TLabel;
    Label4: TLabel;
    MonthCalendar1: TMonthCalendar;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBQuery1: TIBQuery;
    Button1: TButton;
    Label5: TLabel;
    ComboBox1: TComboBox;
    Label6: TLabel;
    Label7: TLabel;

    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

type
  Test = class(TThread)
  private
    { Private-Deklarationen }
  public

  protected
    procedure Execute; override;

end;

var
  Form1   : TForm1;
  Test   : TestThread;
implementation

{$R *.DFM}

procedure Test.Execute;
begin
  sleep(5000);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  //Hier folgt was wichtiges

end;

procedure TForm1.Button1Click(Sender: TObject);
var datum : TDate;
begin
  datum := MonthCalendar1.Date;
  // diesen Aufruf würden wir gerne machen Test.create(false,label1,label2,progressbar);
end;

end.

Es geht aber leider nur Test.create(false);

Pfoto 14. Feb 2008 14:47

Re: Konstruktor Thread - Frage
 
Hallo pronny31,

hier mal grundsätzlich der Ablauf, wie die Daten austauschen kannst
zwischen Deinem Thread und der Hauptanwendung:


Möchtest du bestimmte Daten schon bei Beginn übergeben, so
überschreibe die Methode Create und vergebe dort neue Parameter.
Diese übernimmst du noch in der Create-Methode in private Variablen
des Threads.

Wenn dein Thread nun am arbeiten ist und Daten braucht oder aber
auch Daten an die Anwendung geben will, setzt du ein Event, das
von der Anwendung aufgenommen wird.
Damit der Thread nun nicht weiterarbeitet und evtl. auch auf die
visuellen Komponenten zugreift, musst du dieses Event synchronisiert
ausgeben, d.h. im Grunde genommen, er wird solange angehalten, bis
das Ereignis in der Hauptanwendung abgearbeitet wurde.

Du kannst dein Event selbst definieren mit Parametern die du
gerne übergeben oder lesen möchtest oder übergibst gleich
die Instanz des Threads mit, in Form von "Sender" wie man
das z.B. bei den Button-Klicks und vielem anderen hat.

Um auf diesen Sender, nämlich deinen Thread, von der Hauptanwendung
innerhalb des auszuwertenden Events sinnvoll zugreifen zu können,
solltest du bestimmte Eigenschaften des Threads öffentlich machen,
d.h. also im "public"-Teil definieren.

Hat diese Übergabe oder das Auslesen der Eigenschaften stattgefunden
ist die Event-Methode beendet und der Thread bekommt wieder die
Möglichkeit weiterzuarbeiten -- nun also wenn gewollt mit den
soeben übergebenen Daten.


Probiere es mal aus und lese alles mögliche über das Thema,
dann wird's schon klappen.


Gruß
Pfoto

pronny31 14. Feb 2008 14:50

Re: Konstruktor Thread - Frage
 
Danke ! Es hat funktioniert !
2 Ausrufezeichen in einer Zeile !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz