Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 09:07 Uhr.
Seite 2 von 2     12   

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