Announcement

Collapse
No announcement yet.

Thread bleibt stehen - EAccessViolation (kein suspend,keine Zeilennummer)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thread bleibt stehen - EAccessViolation (kein suspend,keine Zeilennummer)

    Hallo,

    ich habe in meiner Anwendung einen Thread zur regelung eines Motors. Der
    Thread bleibt sporadisch an verschiedenen Stellen der Switch-Case anweisung stehen (d.h. kein Suspend). Ich habe jetzt ein
    try-catch Block darumgebaut erhalte jetzt im Fehlerfall einen "EAccessViolation"
    von e.Message mehr nicht. Die Anwendung stürzt nicht ab aber die while-Schleife wird auch nicht mehr ausgeführt.
    Zusätzlich habe ich noch #include <except.h> und mit
    __ThrowExceptionName() und __ThrowLineNumber()
    weiter Informationen zu bekommen. __ThrowExceptionName() liefert 0
    und __ThrowLineNumber() nichts.

    Wie kann ich das Problem weiter analysieren? Wer kann Helfen?

    --------------------------------------------------------------------------------------
    void __fastcall TMotCtl::Execute()
    {
    try {


    while (!this->Terminated)
    {
    switch...
    case...
    ...
    ...
    } // end while

    }
    catch (Exception& e)
    {//Da man über Synchronize keine Parameter übergeben
    //kann, wird ein Datenelement ExceptionMsg verwendet.
    ExceptionMsg=e.Message + " Typ: " + __ThrowExceptionName()+ IntToStr(__ThrowLineNumber()) + " : " + __ThrowFileName();
    //ExceptionMsg= IntToStr(__ThrowLineNumber());
    Synchronize(&ShowMyExceptionMessage);
    }
    catch (...)
    {
    ExceptionMsg="Exception ...";
    Synchronize(&ShowMyExceptionMessage);
    }

    }

  • #2
    die while-Schleife wird desshalb nicht mehr ausgeführt., weil eine Exception auftritt, und der Catch Block susserhalb der while Schleife liegt.
    Nach dem Catch wird die Funktion Execute verlassen und somit der thread beendet.

    Warum es zu einer Exception kommt laesst sich nur vermuten.
    Wahrscheinlich greifst du in deiner Switch Anweisung auf einen ungueltigen Speicherbereich zu. Vektorindex zu gross?, Benutzer Speicher anderswo wieder freigegeben?....

    Comment


    • #3
      fast.
      Den try-catch block habe ich nachträglich zur Fehleranalyse eingebaut.
      Zuvor wurde im Fehlerfall die while-schleife auch nicht mehr ausgefüht
      es trat aber auch keine Fehlermeldung auf.

      Comment


      • #4
        Na großer meister das ist wohl nicht ganz richtug :
        while (!this->Terminated)

        Terminated ist bei starten false.
        so wäre richtig
        while( !Terminated )

        mfg
        Fred

        Comment


        • #5
          dieses zusätzliche 'this->' ist nicht falsch sondern nur überflüssig (zugegeben)
          beides funktioniert.

          Comment


          • #6
            Ich meinte nicht this-> sondern die
            abfrage auf tru false von Terminated.
            Bei deiner abfrage kommst du gar nicht erst in while rein.

            Nehme alles zurück, ! nicht gesehen trotz brille

            Achtung, dein synchronize ist gar nicht in der while, somit
            wird synchronize beim beenden aufgerufen.

            Würde Dir für deinen Fall der mororsteuerung
            empfehlen einen api thread zu nehmen.
            Durch das synchronize weißt du nie wann du drann bist.


            fred
            Zuletzt editiert von Fred Nest; 18.09.2008, 16:32.

            Comment


            • #7
              Die
              Synchronize(&GuiElements);
              Zeile ist schon drin. Habe ich im Beispiel nur herausgekürzt.
              Was ist ein api thread? Wo Infos?
              Zuletzt editiert von hawiwo; 18.09.2008, 16:37.

              Comment


              • #8
                siehe letzten eintrag

                Comment


                • #9
                  Mal wieder zu spät gesehen,

                  nur kurze ausschnitte zu api thread
                  globale variablen definieren

                  bool oder int ThreadActive
                  DWORD ThreadID
                  HANDLE hThread

                  funktion definieren

                  unsigned long _stdcall mythread( void *v )
                  {

                  while( ThreadActive )
                  {
                  dein code
                  } // while

                  return 0;
                  }

                  // programm aufruf

                  ThreadActive = true;
                  hThread=CreateThread( NULL, 0, mythread, 0, 0, &ThreadID );

                  und beim beenden vom programm oder sonstwann
                  ThreadActive = false;
                  sleep(1000); // etwas warten
                  vergessen
                  TerminateThread( hThread, ThreadID );

                  mfg
                  fred

                  Comment

                  Working...
                  X