Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads
不要用Win32 API PostThreadMessage()向UI線程發送消息。
PostThreadMessage is a Win32 API used to post messages to threads. Usually, the message posted is a standard windows message with the window handle set to NULL.
PostThreadMessage是一個Win32 API常用于向線程發送消息。通常,這個被發送的消息是個窗口句柄被設為NULL的,標準的窗口消息。
When PostThreadMessage is used to post messages to a thread that has created a window, it is very likely that the posted messages will be lost. This is because UI threads are not always run by the primary message loop. For example, when a thread is showing a message box, it is running on the message loop supplied by the message box. This secondary message loop does not know how to handle the thread message (since its window handle is NULL) and it will be dropped.
當你將PostThreadMessage用于向一個創建窗口的線程發送消息,結果這個消息很可能會丟失。這是因為UI線程并非總是在一級消息循環中。例如,當一個線程正顯示一個消息對話框,它就運行在這個消息對話框提供的(代理的)消息循環中。這個二級消息循環不知如何處理這個線程消息(因為其窗口句柄是NULL)所以它會被放棄。
So when posting messages to a UI threads, use PostMessage() instead and post messages to a window owned by that thread. Then the messages won’t be lost, even if the thread is running a secondary message loop.
因此,當要發送一個消息給UI線程,就用PostMessage()作替代并向線程自己的窗口發消息。這樣消息就不會被丟失,即便這個消息是運行在二級消息循環中。