SendMessageTimeout bleibt hängen, das Timeout greift nicht

02/12/2011 - 08:31 von Martin Richter [MVP] | Report spam
Hallo!

Ich habe zwei UI Threads in einem Prozess, d.h. in beiden làuft eine
Message Queue und beide haben eigene Fenster.

- In Thread 2. steht der Benutzer in einem aktiven Fenster und drückt
eine Taste.
- Diese Taste löst eine Nachricht (WM_APP) aus, die per
SendMessageTimeout an den Thread 1 gesendet wird. (Das Ergebnis ist
nicht extrem wichtig, dient aber der Synchronisation der Threads.)
- Thread 1 ist inaktiv d.h. steht in der Message Loop und die Nachricht
wird sofort analysiert.
- Beim abarbeiten der Nachricht wird nun eine MessageBox angezeigt, die
den Benutzer eine Information anzeigt.
- Die MessageBox wird angezeigt.
- Klar kann nun die Nachricht in Thread 1 nicht mit einem Ergebnis
zurückkehren und jetzt müsste in Thread 2 das Timeout greifen, das
relativ kurz ist mit 250ms.

Was aber nun passiert ist, dass die ganze Anwendung steht.
Thread 1 steht in der MessageBox Routine die MessageBox ist angezeigt,
man kann aber keine Taste drücken, weder mit der Maus noch mit der
Tastatur. Man sieht mit dem Mauscursor den "Blue circle of death" ;)
Thread 2 steht in der Auslieferung der Nachricht in SendMessageTimeout,
aber es kommt niemals ein Timeout.
Das ist an den Callstacks klar zu sehen.

Dieses Phànomen kann auf XP, WIndows 7 32bit und 64bit Debug/Release
nachgestellt werden.

Hat jemand eine Idee oder zumindest einen Tipp in eine Richtung?
Was kann bitte der Grund sein, dass SendMessageTimeout nicht
zurückkommt? Eigentlich wurde es doch genau für Fàlle gebaut, in denen
nicht sicher ist, dass die Nachricht in geeigneter Zeit bearbeitet wird

Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com
 

Lesen sie die antworten

#1 Stefan Kuhr
02/12/2011 - 10:54 | Warnen spam
Hallo Martin,

On 12/2/2011 8:31 AM, Martin Richter [MVP] wrote:
<snip>
Hat jemand eine Idee oder zumindest einen Tipp in eine Richtung?
Was kann bitte der Grund sein, dass SendMessageTimeout nicht
zurückkommt? Eigentlich wurde es doch genau für Fàlle gebaut, in denen
nicht sicher ist, dass die Nachricht in geeigneter Zeit bearbeitet wird




Hast Du eventuell die input queues beider threads aneinander attached
mit AttachThreadInput?

Dann wuerde folgendes aus dem Remark von SendMessageTimeout greifen:

"If the window receiving the message belongs to the same queue as the
current thread, the window procedure is called directly—the time-out
value is ignored."

S

Ähnliche fragen