Fehler: "Cannot access inactive scope" ???
-
Mahlzeit,
ich hätt gerne mal en problem
Und zwar is die Sache so, dass ich n Prog schreiben soll, dass u.a. auf ankommende Frames lauscht und dies solange bis ein spez. Timer abgelaufen ist. Ich hatte dazu im Sinn, einen Timer zu verwenden, der mir eine globale Bool-Variable timeout setzt, wenn der OnTimer-Event gestartet wird (dh wenn der Timer endet). Diese timeout Var. wollte ich dann in einer Schleife abfragen, wie zB so:
while ((!timeout)&&(!MyNode.recv()); //läuft solange bis timeout true oder etwas empfangen wurde
Nun ist die Konstellation so, dass der Timer in einer Klasse (Form1) definiert ist, die Afrage nach dem timeout aber in einer anderen Klasse (Node) stattfindet. In dieser Klasse wird der Timer über einen Pointer auch gestartet.
Hier mal der Code:
void Node::timer(int time) { timeout=false; (*MyTimer)->Interval= time; (*MyTimer)->Enabled=true; }
wobei MyTimer im Header als
TTimer ** MyTimer;
deklariert ist und der Eventhandler der anderen Klasse so aussieht:
void __fastcall TForm1::SwitchOffTimer(TObject *Sender) { Timer1->Enabled=false; MyNode.timeout=true; }
wobei in einer Funktion dieser Klasse der Referenz MyTimer die Adresse von Timer1 mittels:
MyNode.MyTimer=&Timer1;
zuweist.
Mein Problem ist nun, dass einfach NIX passiert, dh der OnTimer Event wird nie getriggert. Im Einzelschrittmodus zeigt eine Überwachung des Timer1 Objekts folgende Meldung: "Cannot access inactive scope!"
Woran liegt das? Wird der Timer etwa nicht parallel ausgeführt? Bitte um Rat, da die Timer-Problematik noch recht neu für mich ist.
Dank und Mfg
Marzen
-
marzen schrieb:
wobei MyTimer im Header als
TTimer ** MyTimer;
deklariert ist
Warum das denn? Warum nicht einfacher
TTimer * MyTimer
?
Ansonsten sehe ich jetzt keinen Fehlergrund.
bis bald
akari
-
akari schrieb:
Warum das denn? Warum nicht einfacher
TTimer * MyTimer
?
Ansonsten sehe ich jetzt keinen Fehlergrund.
...Hallo akari,
natürlich geht es so direkt auch zu deklarieren. Natürlich müsste ich dann die Referenz so gestalten:
MyNode.MyTimer=Timer1;
Das funktioniert aber auch nicht. Die selbe Fehlermeldung!
Ich hatte nur eine Referenz auf einen Zeiger auf ein Timerobjekt probiert, da ich dachte, so könnte es gehen...Muss ich da irgendeinen globalen Namespace verwenden oder was meint der Fehlertext?
Mfg
-
Hallo
Das funktioniert aber auch nicht. Die selbe Fehlermeldung!
Aber kompilieren läßt es sich? (sollte wenn du die Umstellung korrekt gemacht hast)
Die Fehlermeldung im laufendem Debugger besagt nur, das du wenn du eine Variable untersuchen willst, diese im aktuellen Scoop bekannt sein muß. Aktuell bedeutet von der Zeile aus, in dem der Debugger gerade hält. Das heißt du brauchst erstml einen Breakpoint an einer interessanten Stelle im Code, um wenn das Programm an dieser Stelle vorbeikommt, eine Anzeige zu bekommen. Baue ein Minimalbeispiel zusammen, mit dem du den Fehler reproduzieren kannst und poste dann den gesammten relevanten Code, mitsamt Deklarationen und an welcher Stelle du genau welche Variable untersuchst.
bis bald
akari
-
Ein Timer funktioniert auf Basis des Nachrichtensystems. Wenn die Anwendung ausgelastet ist, erhält der Timer keine Nachrichten.
In der Schleife, ab und zu, ein ProcessMessages() aufzurufen könnte das Problem lösen.Grüße Joe_M.
-
Gruß und danke für die Tips!
Ein Application->ProcessMessages() in der while-schleife brachte Abhilfe! Jetzt funzt zumindest das schon mal...
Danke!
Mfg
Marzen