![]() |
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:
Jetzt wollte ich den Konstruktor implementieren :
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;
Delphi-Quellcode:
Mein Problem ist nun folgendes ... er kann die Prrozeduren addThread , FSuspended usw. nicht finden (Undefinierter Bezeichner) !
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; |
Re: Konstruktor Thread - Frage
wie sollte er, Du hast diese Variablen doch gar nicht definiert
|
Re: Konstruktor Thread - Frage
Die wurden doch vererbt !!!!!
|
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. |
Re: Konstruktor Thread - Frage
Zitat:
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. |
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 .....
|
Re: Konstruktor Thread - Frage
Such mal nach Synchronize.
|
Re: Konstruktor Thread - Frage
Zitat:
![]() /EDIT: roter Kasten? |
Re: Konstruktor Thread - Frage
Ich brauche aber die Daten einer Komponente aus dem Hauptthread ! Wie bekomme ich Daten vom HauptThread an den CHildThread ......
|
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; |
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.
|
Re: Konstruktor Thread - Frage
Mit synchronize kann ich aber nicht innerhalb des Childthreads auf Komponenenten des Formulars zugreifen !
Wie bekomme ich das hin ? |
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. |
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); |
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 |
Re: Konstruktor Thread - Frage
Danke ! Es hat funktioniert !
2 Ausrufezeichen in einer Zeile !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz