AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi alzaimar workerthread zugriff auf dynam erstellte Komponente

alzaimar workerthread zugriff auf dynam erstellte Komponente

Ein Thema von th_bone · begonnen am 11. Jan 2010 · letzter Beitrag vom 11. Jan 2010
Antwort Antwort
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#1

alzaimar workerthread zugriff auf dynam erstellte Komponente

  Alt 11. Jan 2010, 18:11
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.344 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon

  Alt 11. Jan 2010, 18:16
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#3

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon

  Alt 11. Jan 2010, 18:52
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: alzaimar workerthread zugriff auf dynam erstellte Kompon

  Alt 11. Jan 2010, 19:49
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf