0
我想從工作線程訪問我的對話框的拖動滑塊控件。我讀了很多關於從工作線程訪問主窗口控件的警告。因爲他們很有可能導致死鎖。在這種情況下,如何使用消息訪問控件?我知道如何創建用戶定義的消息(WM_USER)並編寫我們自己的處理程序。它想知道的是,每個控件是否有系統定義的消息,並且如果存在,如何發佈這些消息以訪問控件?如何使用消息訪問mfc控件?
我想從工作線程訪問我的對話框的拖動滑塊控件。我讀了很多關於從工作線程訪問主窗口控件的警告。因爲他們很有可能導致死鎖。在這種情況下,如何使用消息訪問控件?我知道如何創建用戶定義的消息(WM_USER)並編寫我們自己的處理程序。它想知道的是,每個控件是否有系統定義的消息,並且如果存在,如何發佈這些消息以訪問控件?如何使用消息訪問mfc控件?
您可以使用PostMessage向控件發送消息,並且主UI線程將實際將消息分派給控件,即該工作將在UI線程上發生(假設UI線程正在泵送消息)。看着afxcmn.inl你可以看到什麼SetPos是這樣做的:
_AFXCMN_INLINE void CSliderCtrl::SetPos(_In_ int nPos)
{ ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); }
改變,對於PostMessage的:
::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos);
如果你想要的東西更復雜的後一個WM_USER消息給父窗口和處理您的控制管理功能,因爲WM_USER消息將再次由UI線程分派,因此您可以安全地使用控件。
你能解釋下面的例子嗎?我有一個CSliderCtrl命名滑塊。如果我想改變滑塊控件的位置,我怎樣才能不使用slider.setpos()?我如何才能通過發佈消息來做到這一點? – Kumar 2014-11-25 09:32:48
在您發佈的WM_USER消息中,您可以直接調用slider.setpos,因爲您將在UI線程中。我也更新了答案。 – snowdude 2014-11-25 11:57:23