Messageloop, SendMessage, Blockierung..



  • Hallo Leute,

    gestern hatte ich ein Problem, welches sich heute (zumindest vorübergehend) in Luft aufgelöst hat, trotzdem möchte ich dem gern nach gehen und auch verstehen..

    Ich versuche das Problem so gut es geht zu beschreiben.

    Ein Kollege hat seine Berechnungen analysiert und sagt zu mir, dass meine Programme abgestürzt sind.
    Wie ein Absturz sah es nicht aus, eher wie eine Endlosschleife im GUI-Thread (weisses Fenster und so)..
    Naja gut, Visual Studio Attached und mal auf Pause geschaltet, um zu sehn, was die Threads so machen...

    Dann Verwirrung pur...

    Zwei Threads sind bei einem SendMessage hängengeblieben. Das schicken der Nachrichten passiert in einer durch Mutex versperrten Region und dadurch sind andre Threads beim WaitForSingleObject hängengeblieben... Daraufhin natürlich ein Totalstillstand der Applikation

    Nach einem Programmneustart, hat alles ca. 10-15sek funktioniert und dann wars blockiert. Irgendwie hatte ich auch das Gefühl, dass in den 10-15sek die Anwendung immer langsamer wurde

    Rechner Neustart hat nichts geholfen und bei anderen Programmen war das Problem das selbe.

    Dann irgendwann die SendMessage Blöcke auskommentiert - läuft... einkommentiert - läuft auch wieder ..... ?????

    Was ist da passiert?
    Gibt es irgendeine Möglichkeit, dass sich die MessageLoop aufhängt und dadurch SendMessage nicht mehr zum Zug kommt?
    Oder dass die MessageLoop aufhört zu laufen?
    Oder, oder, oder....????

    Wenns die Beschreibung zu ungenau war, bitte Nachfragen 🙂
    Bin ja auch nur Betriebsblind *g*

    lg und vielen Dank schon mal
    Willie


  • Mod

    1. Wenn man SendMessage für ein Fenster eines anderen Threads verwendet, dann wird diese Nachrichtnur dann abgearbeitet, wenn dieser Thread in der Message-Lop steht.
    2. Führt nun der zweite Thread ein SendMessage an Thread1 aus, oder macht irgwendwas (z.B. warten auf eine Mutex), dann steht dieser Thread und holt keine Nachrichten ab.
    3. Wenn nun Thread 1 den Mutex auch noch hält, dann haben wir einen Deadlock!

    Das Ganze steht bei SendMessage in der MSDN Doku ausführlichst beschrieben und ist ein ganz typischer multithreaded Fallstrick.

    SendMessage führt eine Threadsynchronisation durch! SendMessage sollte man also vermeiden, wenn es geht. Kanst Du nicht mit PostMessage leben, oder snd Zeiger im Spiel.



  • Vielen Dank für deine Antwort. Hat mir weiter geholfen 😉

    Nochmal für alle, die irgendwann mal das Problem haben sollten, ein Auszug aus der MSDN über SendMessage:
    "Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. However, the sending thread will process incoming nonqueued messages while waiting for its message to be processed. To prevent this, use SendMessageTimeout with SMTO_BLOCK set. For more information on nonqueued messages, see Nonqueued Messages."

    Ab sofort verwende ich SendMessageTimeout.

    lg
    Willie


  • Mod

    WillieMacMoran schrieb:

    Ab sofort verwende ich SendMessageTimeout.

    Das ist unter Umständne keine Lösung. Denn dann kommt die Nachricht nicht an. Und blockieren tut das System für die Zeit des Timeouts auch.

    Also besser: SendMessage und SendMessagetimeout vermeiden.


Anmelden zum Antworten