2017-01-01 200 views
1

我想創建一個應用程序WinAPI的/窗口,因爲我不希望我的執行封鎖,同時等待消息,我打算有2個線程;一個主線程和一個應用程序線程。應用程序線程會創建窗口(CreateWindowEx),然後阻塞在消息循環中。WinAPI的多線程應用程序

我的困境來自於想要修改應用程序的一部分的主線程。例如,更改樣式,大小等。爲了讓應用程序保持線程安全,我會假設最好將這種代碼保留在同一個線程中。我的第一個想法是從主線程發佈消息,以便應用程序線程解除阻塞並可以處理該請求,然後再次阻止。但是,我不確定是否從一個單獨的線程發送消息是安全的,而且我很難在線查找答案。也許還有更好的解決方案,我不考慮。我將不勝感激任何幫助或反饋。

+1

這個任務,你不需要有2個(或多個線程) - 單線程綽綽有餘。使用'MsgWaitForMultipleObjectsEx'基礎消息循環 – RbMm

+2

是的,您可以在線程之間發佈(或發送)消息。 –

回答

2

發送消息與SendMessage和/或PostMessage跨線程是安全的和支持。

SendMessage函數等待,而其他線程處理消息PostMessage的不等待。有兩個,但在你的情況需要記住的重要事情之間的其他區別是,你不能做

... 
if (whatever) 
{ 
    char buffer[100]; 
    strcpy(buffer, "hello world"); 
    PostMessage(g_MyWindow, WM_APP, 0, (LPARAM) buffer); // BUG, must use SendMessage 
} 
... 

因爲緩衝區可能超出範圍的其他線程處理的消息之前。

一般來說,處理諸如MoveWindowGetWindowRect之類的窗口的所有Windows函數都是線程安全的。他們中的大多數也可以在Windows上的另一個進程使用...

+0

有幾點需要注意:'1'儘管技術上線程安全,但應始終從創建窗口的線程調用窗口增變器。例如,爲[DestroyWindow](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682.aspx)明確闡述了這一點。 '2'應該使用'SendMessageTimeout'完成跨線程發送消息以防止死鎖。 '3'雖然'SendMessage'正在等待目標返回,它仍然會派發入站的跨線程消息。 – IInspectable

+0

@IInspectable是SendMessage函數給其他線程是有風險的,如果目標不處理的消息,但你一般只針對它後衛與其他進程打交道時,你只需承擔自己的代碼是免費的bug;)從一個工作線程發送消息的UI線程不應該是一個問題。 – Anders

+0

僅僅因爲一個線程在你的過程中運行並不意味着它是你的代碼。 – IInspectable