Thread bleibt hängen



  • Wie schon die meisten anderen Beiträge bezieht sich auch dieser auf das Thread und SMTP-Problem.Beschreibung:

    Mein Thread durchsucht eine LogDatei nach Abweichungen von irgendwelchen Werten und schickt bei gegebenen ABweichungen eine Email per SMTP Protokoll.

    Vom Prinzip her läuft dieser Programmabschnitt auch, jedoch bleibt der Thread ab und zu und vollkommen unregelmäßig stehen und kann nicht mehr neu gestartet werden. Es kommt auch zu keinerlei Fehlermeldung. Das Programm bleibt einfach stehen. Die anderen Funktionen der Toolbar können weiterhin benutzt werden.
    Nur der Thread steht und kann nicht mehr neu gestartet werden.Wenn dies versucht wird kommt Thread Fehler (5), Zugriff verweigert.

    Deshalb meine Frag, wie kann ich das Stehenbleiben eines Threads abfangen und ihn dann programmmäßig neu starten. Hat jemand eine Idee ??

    FGGF

    Edit1: Könnte dies mit dem Senden der Email zusammenhängen ??



  • Hallo Godfather,

    mit zeimlicher Sicherheit, hast Du in Deinem Thread einen Aufruf einer Methode oder einer Funktion, die "hängenbleibt" bzw. u.U. eine Exception schmeißt, was ideal wäre.
    Beispiel:
    In einem Datenbankthread wird die Ausführung eines SQL-Statements gstartet und entweder die Datenbankabfrage dauert sehr lange oder die DB-Verbindung wird während der Query unterbrochen. Wenn in einem solchen Fall keine Exception ausgworfen wird, steht der Thread.

    ---Query wird angestoßen
        ExecQuery(); // wenn jetzt die DB-Verbindung unterbrochen wird und keine
                    // Exxeption ausgelöst wird, steht der Thread
    //---------------------
    
    // Deshalb besser
        try{
            ExecQuery();
        }
        catch(...)
        {
            // auswerten des Fehlers
        }
    //-------------------------------
    

    Eventuell kannst Du das Aussenden der Mail auch in einen try/catch Block fassen. Voraussetzung ist nbatürlich, dass eine Exception geworfen wird.
    Um festzustellen, wo Dein Thread stehenbleibt, würde ich an den in Frage kommenden Stellen einen Trace in eine Log-Datei schreiben.
    Einen Thread knallhart abschießen ist nicht unbedingt zu empfehlen, müsste aber auch gehen. Nur wie, müsste ich jetzt auch die MSDN durchblättern und das kannst Du ja sicherlich genauso gut wie ich.

    Gruß
    Gerhard



  • Servus Gerhard,

    ich habs jetzt mal so probiert:

    if(a<b)
        {
          try
          {
              SendMailTo();
          }
    
          catch(...)
          {
          }
        }
       //Programmfortsetzung
    

    Rein theoretisch müsste er bei einer Exception diese catchen und danach einfach das Programm fortsetzen. Im Prinzip brauche ich keine explizite Fehlerbehandlung. Das einzige was passiert, es wird halt keine Email versendet.

    Allerdings bin ich mir nicht sicher ob meine Überlegungen so stimmen. 😞

    FGGF



  • Falls SenMailTo() eine Exception wirft ist es o.k.
    Die Methode SendMailTo() ist mir so nicht bekannt, ist es eine von Dir geschriebene Methode, die eventuell mit ShellExecute blah,blah arbeitet ?
    Wenn ja, würde ich Dir empfehlen die MAPI32.DLL zu benutzen.
    Solltest Du eine Exception erhalten, würde ich diese auf jeden Fall auswerten und z.B. den Thread mit Terminate beenden und neu aufrufen.

    Gruß
    Gerhard



  • Servus Gerhard,
    habe jetzt folgenden Code implementiert

    try
          {
            SendMailTo();
          }
    
          catch(...)
          {
            //Log-Datei schreiben
            LogDatei->LoadFromFile(Datei);
            Meldung="Am "+GetCurrentDateTime()+ " ==> Exception im MailProgramm " +
                    " ==> Exception gefangen.";
            LogDatei->Add(Meldung);
            LogDatei->SaveToFile(Datei);
            Form10->Show();
            Sleep(1000);
            Form10->Close();
          }
    
          Sleep(1000);
          Form9->Close();
    

    Es wird zwar noch ab und zu eine Exception in die LogDatei geschrieben, aber der Thread läuft bisher weiter. Was eigentlich die Hauptsache ist.
    Ich vermute es handelt sich um einen 10038 Socket Fehler, der normalerweise von Indy gefangen werden sollte. Auf jeden Fall hat es mal wieder so funktioniert wie du gesagt hast 👍
    Der Thread läuft trotz ab und zu auftretender Exceptions weiter und bleibt bis jetzt nicht mehr hängen. Werde ihn mal übers Wochenende weiterlaufen lassen und dann kann ich dir am Montag sagen obs funktioniert hat.

    @ Gerhard 1000Dank

    bis zum nächsten mal
    FGGF (Steffen)



  • Morgen zusammen,
    wünsche euch ne schöne neue Woche, und ne gute KLimaanlage.
    Moin Gerhard, ein Testprogramm lief komplett durch ohne Fehler und das andere
    hat sich mal wieder wegen dem Thread aufgehängt.
    Muss mals chauen an was es lag.

    Gruss Steffen
    FGGF


Anmelden zum Antworten