aus Thread in Kompo auf Variabeln zugreifen
-
danke für die antwort, aber ich habe mich warscheinlich etwas ungenau ausgedrückt
ich entwickle eine Komponente. in dieser starte ich einen Thread, welcher Werte in der Komponente abfragen soll.
zB die funktion wenn der Thread auf von einer Form gestartet wird// in der Synchronize funktion if (Form1->Zahl == 3) ...jetzt ist aber der Wert
int Zahl;nicht auf einer Form deklariert, sonder in der komponente
class PACKAGE MyKomponente { int Zahl; .. // Thread im Destruktor starten ...}jetzt will ich vom thread aus auf die Variable "Zahl" zugreifen.
wie mache ich das?
-
ich würde den wert dieser variable im konstruktor übergeben, wenn der thread gestartet wird.
__fastcall TMyThread(int iZahl); //Konstruktor für Zahlübergabe.
-
thx das klappt soweit..
aber da ich mehrere Daten lesen/überschreiben möchte, währe ich froh, wenn jemand noch eine andere möglichkeit wüsste..
-
hm, und wenn Du dem Thread eine Referenz auf die Komponente übergibst? Dann solltest Du du doch innerhalb des Threads auf die Daten zugreifen können, oder nicht? Möglicherweise mußt Du den Zugriff aber über TCriticalSection threadsicher machen.
-
das mit der Referenz ist ne gute idee. ich werde das mal testen.
das ich das ganze threadsicher machen muss ist mir klar.
hatte eigentlich vor mitSynchronizeTCriticalSection kenne ich nicht und die msdn spuckt nur für Visual C++ aus.
kannst du mir den unterschied erklähren?
thx
-
Hallo
TCriticalSection steht in der BCB-Hilfe drin.
Mit TCriticalSection können Operationen abgesichert werden, die nicht durch den Start eines anderen Threads unterbrochen werden dürfen. Kritische Abschnitt arbeiten wie Gates, die jeweils nur einen einzelnen Thread durchlassen. Da die Ausführung aller anderen Threads blockiert wird, verringert sich die Leistung der Anwendung erheblich, wenn kritische Abschnitte zu häufig eingesetzt werden.
bis bald
akari
-
Joe_M. schrieb:
Möglicherweise mußt Du den Zugriff aber über TCriticalSection threadsicher machen.
Man streiche "möglicherweise" und es stimmt (o;
-junix
-
Sorry, wenn ich das thema nochmals aufrolle
Ich bin zur entscheidung gekomment, dass ich das mit der Referenz auf meine Komponente lösen möchte.
da ich mich da leider noch nicht so gut auskenne, stehe ich gerade voll auf dem schlauch.
wie komme ich an die Referenz der eigenen Komponente?Prinzip
class MyKomponent { int iZahl; TThread *MyThread = new TRead(false, ReferenzMeineKomponente); //Referenz übergeben } // im Thread void __fastcall TRead::Execute() { MeineKomponente->iZahl = 33; }schonmal thx für jegliche Hilfe
-
*this ???
-
Sunday schrieb:
*this ???
das funktioniert eben nicht

ich oute mich hiermit als unfähig und bitte um hilfe und aufklährung
jetzt mal mit orginalcode:TElTecComm -> Komponente
TElTecCommRead -> Thread//TElTecComm h-file TThread *ReadThread; //TElTecComm cpp-file ReadThread = new TElTecCommRead(false, this); //2 //TElTecCommRead h-file __fastcall TElTecCommRead(bool CreateSuspended, TElTecComm *Comm); //1 //TElTecCommRead cpp-file __fastcall TElTecCommRead::TElTecCommRead(bool CreateSuspended, TElTecComm *Comm) : TThread(CreateSuspended) { ... }
-
achja, hier noch die Fehlermeldungen
[C++ Fehler] ElTecCommRead.h(22): E2303 Typname erwartet //1 [C++ Fehler] ElTecCommRead.h(24): E2321 Deklaration deklariert weder ein Tag noch einen Bezeichner [C++ Fehler] ElTecComm.cpp(136): E2125 Compiler konnte Standardkonstruktor nicht für die Klasse 'TElTecCommRead' generieren //2
-
so, sorry wegen der belästigung, habe den fehler mitlerweile begriffen

wen es noch intressiert://kompo cpp-file ReadThread = new TElTecCommRead(false, this); //Thread __fastcall TElTecCommRead::TElTecCommRead(bool CreateSuspended, TComponent *compComm) : TThread(CreateSuspended) { TElTecComm *Comm = (TElTecComm *)compComm; }
-
1. Du hast C++ also nutze auch Dinge wie z.B. dynamic_cast() (siehe FAQ!)
2. Wieso "TComponent" und dann den Aufwand zu casten und nicht einfach direkt den Klassenbezeichner deiner Klasse als Parameter?
-junix
-
1. thx für den tipp mit dynamic_cast.. werde es beherzigen..
2. wenn ich dich jetzt richtig verstanden habe, dan habe ich genau das eben schon erfolglos versucht (siehe ab 2. beitrag von dieser seite)
-
1. In Headerfiles werden keine Variablen deklariert. Wenn dann höchsten als "extern" wenns denn schon unbedingt globale sein müssen! (nein müssen es nicht)
2. Du hast hier ein Abhängigkeitsproblem, das sich mit einer Forward-Deklaration lösen lässt. Sprich du schreibst in dein Headerfile von "TElTecComm" vor der Klassendeklaration:
class TElTecCommRead;Das heisst soviel wie "Lieber Compiler, ich hab da ein Objekt, dessen genaue Bedeutung du später noch kennen lernst"
Das Selbe natürlich auch umgekehrt.
3. Warnungen spucken weder Compiler noch Linker nur zum Spass aus (o;
-
3. dachte ich mir auch schon

2. einfach nur

1.
jetzt als ich langsam dachte, ich verstehe die welt, verwirrst du mich...
bin aber gerne bereit, zu lernen.
wenn ich also richtig verstanden habe, ist es nicht ok, im header zB.class MyKomponente { private: int iZahl; AnsiString asFilePath; ... protected: ... };Variablen zu deklarieren, die man häufig in Funktionen braucht?
-
BigNeal schrieb:
1.
jetzt als ich langsam dachte, ich verstehe die welt, verwirrst du mich...
bin aber gerne bereit, zu lernen.
wenn ich also richtig verstanden habe, ist es nicht ok, im header zB.class MyKomponente { private: int iZahl; AnsiString asFilePath; ... protected: ... };Variablen zu deklarieren, die man häufig in Funktionen braucht?
Doch, das (Member-Variablen oder Klassen-Attribute genannt) ist gut.
Nicht so gut sind globale Variablen, ohne einen Bezug zu einer Klasse.
Wenn schon, gehören die in die Implementationsdatei, mit extern-Verweis in der Headerdatei.bis bald
akari
-
ok, dan ist gut.. bei mir fing schon die ganze welt an einzubrechen

das einzige was ich global habe, sind definitionen mit dem schlüsselwort enum und funktionen mit *typedef void __fastcall (__closure ...)
-
BigNeal schrieb:
das einzige was ich global habe, sind definitionen mit dem schlüsselwort enum und funktionen mit *typedef void __fastcall (__closure ...)
Lügner!
BigNeal schrieb:
//TElTecComm h-file TThread *ReadThread;Würde mich sehr wundern, wenn dich der Linker da nicht vor einem Vorkommnis in mehreren Modulen warnt?
-junix
-
Ausführlicher
class PACKAGE TElTecComm : public TComponent { __published: ... private: TThread *ReadThread; protected: ... public: ... };akari schrieb:
Doch, das (Member-Variablen oder Klassen-Attribute genannt) ist gut.
Nicht so gut sind globale Variablen, ohne einen Bezug zu einer Klasse.So wie ich das sehe, hat sie Bezug zur Klasse
etwas mehr vertrauen junix
