Probleme mit Objekterzeugung
-
ich habe eine Klasse geschrieben mit der ich mit einem Messgerät kommunizieren kann. Dies geschieht über RS232. Nun habe ich im Konstruktor als Parameter gleich einen AnsiString mit dem richtigen Port:
RZR::RZR(AnsiString rs232);
In einer Form habe ich eine ComboBox , die alle SeriellenSchnittstellen aus der Registry auflistet. Ein Button OpenComm enthält flg. Ereignis:
RZR* rzr = new RZR(ComboBox1->Text);
Zusätzlich habe ich einen Thread:
LONGLONG frequenz, alt, neu; __fastcall SchnittstellenThread::SchnittstellenThread(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall SchnittstellenThread::Execute() { QueryPerformanceCounter((LARGE_INTEGER*)&alt); while(!Terminated) /* Die Eigenschaft Terminated zeigt an, ob der Thread eine Aufforderung zum Beenden erhalten hat */ { QueryPerformanceCounter((LARGE_INTEGER*)&neu); if ((neu-alt)/(double)frequenz >= 0.1) { Synchronize(UpdateCaption); } Sleep(1); } } //--------------------------------------------------------------------------- void __fastcall SchnittstellenThread::UpdateCaption() { rzr-> .... //funktioniert nicht }
Dieser sorgt auch dafür, dass die Messwerte nach einer bestimmten Zeit aktualisiert werden. Problem ist nun, dass ich hier nicht auf das Objekt rzr zugreifen kann. Ich nehme an, dass dies nicht geht, da ja das Objekt erst beim Klick auf den Button erzeugt wird. Wie kann ich das Problem lösen? (die Header der Klasse hab ich eingebunden)
-
Da dein Kommunikationssthread eine eigene Klasse ist kannst du einen Konstruktor schreiben, der einen Pointer/Referenz auf ein RZR Objekt erwartet. Den Pointer/die Referenz speicherst du als member und kannst sie später benutzen.
-
also schreib ich das in den Konstruktor des Threads?
also hier rein?__fastcall SchnittstellenThread(bool CreateSuspended);
-
Wo sonst?
Probier doch bitte einmal aus, was andere dir raten, statt sofort eine neue Frage zu stellen.
-
wusste nicht ob ich es mit in diesen Konstruktor reinschreibe oder einen neuen anlege. Habe beides auprobiert bekomme aber immer wieder Fehlermeldungen. Habe jetzt einen neuen angelegt und erhalte diesen Fehler:
[C++ Fehler] classSchnittstellenThread.h(16): E2293 ) erwartet
hier mein Konstruktor:SchnittstellenThread::SchnittstellenThread(RZR2102* rzr){}
Ich frage mich jetzt wo ich jetzt das Objekt der Klasse erzeuge. Hab schon verschiedenes probiert, bleib aber immer wieder an Fehlermeldungen hängen.
-
Ich nehme an deine Threadklasse kennt den Typ RZR2102 im Header noch nicht.
Mach da einfach eine Forewarddeklaration.
-
Braunstein schrieb:
Ich nehme an deine Threadklasse kennt den Typ RZR2102 im Header noch nicht.
Mach da einfach eine Forewarddeklaration.doch, hab den Header per include eingebunden. Blöde Frage: Was meinst Du mit einer Forwarddeklaration?
-
siehe z.Bsp.
http://www.adp-gmbh.ch/cpp/forward_decl.html
-
dann müsste ich meine Klasse RZR2102 mit in die Klasse SchnittstellenThread schreiben? Wird das dann nicht alles sehr unübersichtlich? Ich blicke jetzt schon kaum noch durch. Ich habe später noch andere Geräte, die ich mit einbinden möchte, wo ich die Klassen schon alle fertig habe.