Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi alzaimar workerthread zugriff auf dynam erstellte Komponente (https://www.delphipraxis.net/145974-alzaimar-workerthread-zugriff-auf-dynam-erstellte-komponente.html)

th_bone 11. Jan 2010 18:11


alzaimar workerthread zugriff auf dynam erstellte Komponente
 
Hi,

ich habe ein Problem mit dem Zugriff auf eine dynamisch erstellte Komponente aus alzaimar workerthread heraus.

Pappe ich eine Komponente direkt auf die Form klappt der Zugriff z.B. mit "form1.komponentenname" ohne Probleme
- meine dynamisch erstellten Komponenten reagieren aber überhaupt nicht - wo ist hier mein Denkfehler ?

Delphi-Quellcode:
...
// Auschnitt aus der Hauptform
var
  RT: TDdeServerConv;

  DDEsymbols: array[1..500] of string;

  DDElast:    array[1..500] of TDDEServerItem; // Last

implementation

...
  // zur laufzeit die komponente erstellen

  // DDEserver createn
  RT := TDdeServerConv.Create(Self);
  RT.Name := 'RT';

  // Items createn
  for i := 1 to 500 do begin

     DDEsymbol:=DDEsymbols[i];
     DDElast[i]:= TDDEServeritem.Create(self);
     DDElast[i].name:=DDEsymbol+'1';
     DDElast[i].ServerConv := RT;

  end;
...

// Ausschnitt aus dem Workerthread
Procedure TAddDataJob.AddData;
...
Begin
...
  Entercriticalsection(myCS);

          //Dieser Zugriff auf eine Komponente auf der Form funktioniert
            form1.xfeed.lDay:=TD;
 
          // Hier ist das Problem - compiliert ohne fehler - aber geht nicht - das ganze in button und es funktioniert
          DDElast[1].Text:='12345'; // Last <-- was mache ich hier falsch - über form1. läßt es sich nicht ansprechen
 
  LeaveCriticalSection(myCS);
 
End;
Danke

Ralf

himitsu 11. Jan 2010 18:16

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon
 
Zitat:

Zitat von th_bone
wo ist hier mein Denkfehler ?

erstellst du diese Komponenten innerhalb des Threads?
(sowas macht man nicht)

Ansonsten sollte es eigentlich keinen Unterschied machen, ob die Komponenten von der VCL oder manuell erstellt werden.
Sie müssen aber alle innerhalb des Hauptthreads erstellt werden, da die gekapselten Windows-Komponenten an den Thread gebunden sind, in welchem sie erstellt wurden.

th_bone 11. Jan 2010 18:52

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon
 
Hi,

nein die Komponenten werden ganz normal im Hauptprogramm erstellt. Dann wird ein Steuerstring
an den workerthread übergeben der einige Berechnungen erledigt und dann die Daten mit der
Komponente an ein anderes Programm per DDE übergibt.

Mit einer festen Komponente lief der Zugriff über den Workerthread auch ohne Probleme. ich musste
nur "form1." davorsetzen aber sobald ich die Komponente dynamisch erstelle funktioniert der Zugriff
nicht mehr aus dem Workerthread - aber wie gesagt es kompiliert ohne Probleme.

Dynamisch mache ich das, da ich ca. 5000 items benötige.

An der Anzahl der itmes sollte es auch nicht liegen, da ich z.B. wenn ich einen Button auf die Form klatsche
und den Code von dort ausführe es ohne Probleme funktioniert.

Das was mir noch aufgefallen ist, ist dass sich die dynamisch erstellten komponenten nicht über form1. ansprechen lassen
die komponente auf der Form schon.

Tschüss

Ralf

alzaimar 11. Jan 2010 19:49

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon
 
Es gibt im Job eine Property 'Synchronized'. Die steuert, ob der Job im Kontext des Hauptthreads ausgeführt wird oder nicht. Setze die im Konstruktor des Thread mal auf True und versuch dann, ob alles funktioniert.

Wenn das klappt, kannst Du anfangen, die Dinge, die was mit der VCL zu tun haben, in separate Job-Methoden auszulagern, und die (bei Sychnronized = FALSE) direkt mit Synchronize aufzurufen. Dann wird der Job im Hintergrund ausgeführt, aber das Update der sichtbaren Komponenten im Hauptthread.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 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