c ++ - PeekMessage og PostMessage brug

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en gammel applikation, som jeg opretholder, der kalder PostMessage(NULL,WM\_CLOSE,0,0); på bestemte steder. Fra at kigge på koden kan jeg ikke gætte, om den er forbundet til følgende (udført i en anden tråd)


MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM\_REMOVE))  {
    if ( msg.message == WM\_CLOSE)
    {
        return;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg); 
}


Tidligere brugte det nogle win32 events til at synkronisere adgangen mellem tråde. Men nu har jeg revideret det for at bruge std::condition\_variable og std::mutex i stedet. Jeg spekulerer på, om disse PostMessage og PeekMessage i hvert fald var relateret til disse begivenheder. Ansøgningen havde også nogle PumpMessage (som havde den ovennævnte implementering) og StopMessagePump implementeringer, som jeg aldrig har brugt og ikke finder mere brugbare. Programmet skal løbe i baggrunden, dvs. det ejer ikke eller håndterer nogen konsolvinduer alene.


Jeg læser dokumentationen om MSDN, og jeg finder det svært at forstå, da de refererer til PostThreadMessage internt som et specielt tilfælde. [20]


Men hvad er PostMessage(NULL,WM\_CLOSE,0,0) generelt i stand til at gøre?

Bedste reference


Som dokumenteret PostMessage med en NULL opfører sig som PostThreadMessage. Men altid for den nuværende tread. I din situation, hvis der kun er en tråd, er det ligesom at sætte et flag. Selv ingen multithreadning sker. Der kræves ingen mutex eller andre specielle genstande. [21]


Hvis der er multithreading, og hvis der slet ikke er noget vindue, og du ikke behøver nogen synkronisering mellem sådanne vinduer med en PostMessage og en meddelelsessløjfe, kan du bare bruge std::condition\_variable eller std::mutex.


I stedet for PostMessage brug notify\_one eller notify\_all. I stedet for meddelelsessløjfen bruger wait\_for. (Mutex i overensstemmelse hermed)


Men vær opmærksom på, om du har en COM STA eller lignende, har du stadig brug for en meddelelsessløjfe.
Du kan stadig bruge std::condition\_variable eller std::mutex, men du bør kun stoppe meddelelsesløkken, når alle objekter du nogensinde har lavet er ødelagt, og din tilstand er opfyldt!