0
在我的多線程mfc應用程序中,m_view-> SetScrollPos處於阻塞狀態,所有應用程序都被凍結。視圖是在另一個線程中創建的,這是這種行爲的原因嗎?SetScrollPos阻止
//SetScrollPos(SB_HORZ,pos);
::SetScrollPos(GetSafeHwnd(), SB_HORZ, pos, true);
與SetScrollInfo()
相同。
在我的多線程mfc應用程序中,m_view-> SetScrollPos處於阻塞狀態,所有應用程序都被凍結。視圖是在另一個線程中創建的,這是這種行爲的原因嗎?SetScrollPos阻止
//SetScrollPos(SB_HORZ,pos);
::SetScrollPos(GetSafeHwnd(), SB_HORZ, pos, true);
與SetScrollInfo()
相同。
理由很簡單:
改變滾動位置導致創建一些窗口消息。如果您在另一個線程中,並且託管窗口的線程尚未準備好通過GetMessaage/PostMessage處理消息,則使用SendMessage的線程將被阻止,直到消息可以傳遞。
這是一個正常且有據可查的行爲。
我的建議:切勿從其他線程執行UI操作。選擇一種中立的通信方法來通知其他線程有關更改(PostMessage,定時器和數據字段,aso。)...
我試圖使用'PostThreadMessage()'在ui線程中執行setscrollpos,但處理程序沒有被調用。我檢查了ui線程正在抽取其他消息(它沒有被阻塞)。 – user1288043
也可以回答這個問題:http://stackoverflow.com/questions/29967792/command-and-update-command-ui-handlers-not-called-in-mfc-dll – user1288043