在我的多线程mfc应用程序中,m_view-> SetScrollPos正在阻止,并且所有应用程序都已冻结。 View是在另一个线程中创建的,这是出现这种行为的原因吗?
//SetScrollPos(SB_HORZ,pos);
::SetScrollPos(GetSafeHwnd(), SB_HORZ, pos, true);
SetScrollInfo()
也是如此。
答案 0 :(得分:2)
原因很简单:
选择滚动位置会导致创建一些窗口消息。如果您在另一个线程中并且托管窗口的线程尚未准备好通过GetMessaage / PostMessage处理消息,则使用SendMessage的线程将被阻止,直到可以传递消息。
这是一种正常且记录良好的行为。
我的建议:永远不要从另一个线程执行UI操作。选择一个中立的通信方法来通知另一个线程有关更改(PostMessage,Timer和数据字段,aso。)...