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


Anmelden zum Antworten