ungültige Handles erkennen



  • Wenn Du mit dem Handle was machst darf Du *auf keine Fall* den CWinThread sich selber beenden bzw. löschen lassen!!!
    Das was DU machst ist "Zufall" dass es tut!!!

    Also:
    - den Thread "Suspended" starten
    - "m_bAutoDelete" auf "FALSE" setzen
    - Thread resumen

    Jetzt kannst Du das machen was Du willst!
    Egeal ob der Thread schon fertig ist ode nicht, Du kannst jetzt immer darauf "warten". Und am Ende dann ein "delete ..." nicht vergessen 😉



  • Jochen Kalmbach schrieb:

    Und am Ende dann ein "delete ..." nicht vergessen 😉

    Habe gerade duch Zufall noch eine vielleicht elegantere Alternative gefunden. Da man so dem Risiko eines Speicherlecks entgehen kann.

    MSDN schrieb:

    Speichern Sie das Handle des Threads separat. Kopieren Sie nach der Erstellung des Threads mit ::DuplicateHandle dessen m_hThread-Datenmember in eine andere Variable und greifen Sie über diese Variable darauf zu. Auf diese Weise wird das Objekt automatisch bei Beendigung gelöscht, und Sie haben dennoch die Möglichkeit, den Grund für die Beendigung des Threads zu ermitteln. Achten Sie darauf, dass der Thread nicht beendet wird, bevor Sie die Möglichkeit hatten, das Handle zu duplizieren. Am effektivsten lässt sich dies verhindern, indem Sie CREATE_SUSPENDED an AfxBeginThread übergeben, das Handle speichern und anschließend die Ausführung des Threads durch Aufruf von ResumeThread fortsetzen.

    Url: http://msdn2.microsoft.com/de-de/library/2s21xzfe(VS.80).aspx



  • Das kann man auch machen. Ist aber sehr "unperformant", da "DuplicateHandle" "sehr" lange dauert...
    Und man geht IMHO kein Risiko eines Speicherlecks ein, wenn man "delete ..." aufruft!



  • Jochen Kalmbach schrieb:

    Das kann man auch machen. Ist aber sehr "unperformant", da "DuplicateHandle" "sehr" lange dauert...

    Hmm, das ist gut zu wissen.

    Jochen Kalmbach schrieb:

    Und man geht IMHO kein Risiko eines Speicherlecks ein, wenn man "delete ..." aufruft!

    Nein, dann nicht. 😉
    Ich meinte eher, falls man es im Eifer des Gefechts vergessen sollte.



  • Es ist IMHO auch wesentlich "uneleganter" das Handle zu kopieren.
    Andrerseits ist CWinThread auch schon selbst sehr sehr "unelegant" um nicht zu sagen greislich.


  • Mod

    Alterntiv, wenn man eine CWinThread Klasse anlegt, dann kann man den m_bAutoDelete auch dort entsprechend im Konstruktor setzen.

    Es ist auch möglich m_bAutoDelete in der Threadfunktion zu setzen und den Thead nicht suspended zu starten. Man muss aber in jedem Fall prüfen ob AfxBeginThread NULL returniert.



  • HaJo. schrieb:

    Kann m_thread nicht vor Aufruf von WaitForSingleObject überprüft werden?

    if (m_thread->m_hThread)
        WaitForSingleObject(...)
    

    Ja, genau das hatte ich vor. Nur woran erkennt man, ob das Handle ungültig ist?

    Jochen Kalmbach schrieb:

    Wenn Du mit dem Handle was machst darf Du *auf keine Fall* den CWinThread sich selber beenden bzw. löschen lassen!!!
    Das was DU machst ist "Zufall" dass es tut!!!

    Ja, ich weiß, daß es gefährlich ist, aber bisher hatte ich keinen besseren Ansatz. Wie kommt man eigentlich aus dem Inneren der Thread-Funktion auf das drüberliegende CWinTread-Objekt?


  • Mod

    Gar nicht!
    Das Handle ist eben nur so lange garantiert gültig wie man selber ein noch ein offenes Handle hat. Wenn also m_bAutoDelete auf FALSE ist, dann ist das Handle gültig, weil es erst im Destruktor per CloseHandle entsorgt wird.

    Handles werden recycled man kann niemals sagen ob ein Handle noch gültig ist wenn man selbst CloseHandle durchgeführt hat. Es könnte noch gültig sein und das selbe Handle sein, wenn ein anderer Programmteil im Prozess noch das selbe Handle offen hat.

    Andernfalls könnte es das gleiche Handle mit anderem Kontext/Inhalt sein. Oder een ungültig.



  • CStoll schrieb:

    aber bisher hatte ich keinen besseren Ansatz

    Aber jetzt hast Du doch einen besseren Ansatz, oder was fehlt Dir noch zu einer 100%igen Lösung???



  • Die Zeit, ihn in die Praxis umzusetzen 😃

    Edit: Ich hab' das jetzt umgesetzt und erwartungsgemäß funktioniert die Lösung - danke an alle für die kompetente Hilfe.


Anmelden zum Antworten