Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variablen im Thread (https://www.delphipraxis.net/105933-variablen-im-thread.html)

Fredyy 2. Jan 2008 14:44


Variablen im Thread
 
Hi,
Ich habe das Problem, dass ich in der OnCreate Prozedur meines Form1 in Unit1 Variablen setzte, die ich in der Laufzeit meines Threads in Unit2 auslesen möchte, jedoch bekomme ich das irgendwie nicht hin, dass er die Variablen erkennt und hoffe nun auf eure Hilfe, wie ich die Variablen deklarieren muss damit es funktioniert.

danke :)

mfg
fredyy

SirThornberry 2. Jan 2008 14:48

Re: Variablen im Thread
 
um das ganze objectorientiert zu halten solltest du nicht vom Thread aus auf Form1.irgendwas zugreifen sondern solltest dem Thread die Adressen der Variablen mitgeben bzw. die TForm1-Instanz.

Am besten du zeigst mal deinen bisherigen Quelltext damit wir sehen welchen Weg du bisher eingeschlagen hast und welche Weiterführung da im sinnvollsten wäre.

Fredyy 2. Jan 2008 14:58

Re: Variablen im Thread
 
also meine Form TForm1.FormCreate in Unit1 sieht so aus und die variablen hpstart,hpend,field und url möchte ich im Thread weiter verwenden.
Delphi-Quellcode:

  private
    Thread1 : TMyOwnThread;
  public
    filename,link,link2,hpstart,hpend,field,url :string;
    function Ready : Boolean;
  end;

.....

procedure TForm1.FormCreate(Sender: TObject);
begin

   hpstart := 'value="[URL=http://imageshack.us][IMG]';
   hpend  := '[/IMG][/URL]"/>';
   field  := 'fileupload';
   url    := 'http://load.imageshack.us/';
   filename := 'screenshot';
   OpenDialog1.Filter := 'Image File Types|*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff';

   if(ParamCount > 0) then
       Upload(ParamStr(1))
end;
die execute Prozedur vom Thread so, der Thread wird erst erstellt, wenn er benötigt wird:

Delphi-Quellcode:
procedure TMyOwnThread.Execute;
var
   x,y: Integer;
   hpstart,hpend, page,link :string;
   Werte : TIdMultiPartFormDataStream;
begin

            Werte := TIdMultiPartFormDataStream.Create();
            HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
            Werte.AddFile(field, files, 'image/png');
            page := Http.Post(url, Werte);
            Werte.Destroy;
            x := pos(hpstart, page);
            y := pos(hpend, page);
            link := copy(page, x+length(hpstart), y-(x+length(hpstart)));


        if Assigned(OnThread) then
                OnThread(link);
end;
das Problem ist jetzt, dass der Thread die Variablen nicht erkennt.

Danke schon mal für eure Hilfe :)

mfg
fredyy

Dani 2. Jan 2008 15:19

Re: Variablen im Thread
 
Gültigkeitsbereich von Variablen

Wenn das alles noch zu kompliziert ist, kannst du natürlich auch erstmal klein anfangen und das Forum nach Buchempfehlungen für Einsteiger durchpflügen. Dass du dich gleich an Threads wagst ist sehr mutig :)

Fredyy 2. Jan 2008 15:37

Re: Variablen im Thread
 
Zitat:

Zitat von Dani
Gültigkeitsbereich von Variablen

Wenn das alles noch zu kompliziert ist, kannst du natürlich auch erstmal klein anfangen und das Forum nach Buchempfehlungen für Einsteiger durchpflügen. Dass du dich gleich an Threads wagst ist sehr mutig :)

Also wenn ich das Variablen System richtig verstehe sind die im "public" Bereich deklarierten Variablen doch die "Blauen" und die im "private" die "Grünen" also ist es doch richtig oder? o_O

Und zu den Threads, grundsätzlich funktioniert das Programm super doch wollte ich nun etwas umbauen bzw erweitern und dabei ist es ebend wichtig, dass die "Konstanten" des Threads zu Variablen werden die ich aus einer ini-Dateien auslesen möchte jedoch möchte ich nicht jedesmal neu aus der Datei lesen sondern einmal in die Variablen lesen und fertig und ebend jenes soll hier passieren, wenn die Variablen Übertragung funktioniert.

Dani 2. Jan 2008 15:52

Re: Variablen im Thread
 
Das Problem ist, dass dein TMyOwnThread-Objekt die Variablen [= Behälter] des TForm1-Objektes nicht "sehen" kann. Stattdessen hat jedes TMyOwnThread-Objekt eigene, von den TForm1-Variablen verschiedene Behälter. Die heißen zwar gleich, das bedeutet aber nicht, dass auch das Gleiche drin steht.

Fredyy 2. Jan 2008 16:02

Re: Variablen im Thread
 
Zitat:

Zitat von Dani
Das Problem ist, dass dein TMyOwnThread-Objekt die Variablen [= Behälter] des TForm1-Objektes nicht "sehen" kann. Stattdessen hat jedes TMyOwnThread-Objekt eigene, von den TForm1-Variablen verschiedene Behälter. Die heißen zwar gleich, das bedeutet aber nicht, dass auch das Gleiche drin steht.

.. und es gibt keine Möglichkeit die Variablen auch für das TMyOwnThread-Objekt Sichtbar zumachen? Oder die Daten irgendwie anderes zu übertragen?

Was mir gerade noch einfällt man könnte die Daten ja auch beim create-Aufruf das Threads als Attribut mit geben, doch das sind direkt mal 4 Variablen, dass ist bestimmt nicht die "sauberste" Lösung.

dominikkv 2. Jan 2008 16:18

Re: Variablen im Thread
 
Zitat:

Zitat von Fredyy
Zitat:

Zitat von Dani
Das Problem ist, dass dein TMyOwnThread-Objekt die Variablen [= Behälter] des TForm1-Objektes nicht "sehen" kann. Stattdessen hat jedes TMyOwnThread-Objekt eigene, von den TForm1-Variablen verschiedene Behälter. Die heißen zwar gleich, das bedeutet aber nicht, dass auch das Gleiche drin steht.

.. und es gibt keine Möglichkeit die Variablen auch für das TMyOwnThread-Objekt Sichtbar zumachen? Oder die Daten irgendwie anderes zu übertragen?

Was mir gerade noch einfällt man könnte die Daten ja auch beim create-Aufruf das Threads als Attribut mit geben, doch das sind direkt mal 4 Variablen, dass ist bestimmt nicht die "sauberste" Lösung.

Du musst erstens den Unitnamen der 1. Unit (die mit der Form) in die uses der 2. Unit (die Unit mit deinem Thread) einbinden, dann kannst du über Form1.URL drauf zugreifen.

Bedenke aber das das nicht OO ist, besser ist (woe SirThornberry schon sagte) die Thread-Instanz zu erzeugen und gleichzeitig die variablen zu übergeben.

wicht 2. Jan 2008 17:27

Re: Variablen im Thread
 
Du musst die Variablen nicht im OnCreate mitgeben.
Versuch's mal so:

Delphi-Quellcode:
Thread := TMyThread.Create;
Thread.Variable1 := Variable1;
[...]
Thread.Resume;
Also einfach als Eigenschaften des Threads. Du musst nur beachten, dass der Thread erst beim Resume() losläuft, und nicht schon im Konstruktor.

Muetze1 3. Jan 2008 14:21

Re: Variablen im Thread
 
Zitat:

Zitat von wicht
Du musst die Variablen nicht im OnCreate mitgeben.
Versuch's mal so:

Delphi-Quellcode:
Thread := TMyThread.Create;
Thread.Variable1 := Variable1;
[...]
Thread.Resume;
Also einfach als Eigenschaften des Threads. Du musst nur beachten, dass der Thread erst beim Resume() losläuft, und nicht schon im Konstruktor.

So lange es keine Zeiger auf die jeweilige Variable ist, oder das Objekt welches diese enthält, weiter gegeben wird, so lange werden sich Änderungen auf die Variable nicht auf ihren anderen Speicherort auswirken. Sprich: Änderst du Variable1 in deinem Thread, so hat die Variable1 in deiner Form immernoch ihren alten Wert (die Aussage ist reversible).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
Seite 1 von 2  1 2      

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