首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MFC线程中的进度条被阻塞

MFC线程中的进度条被阻塞
EN

Stack Overflow用户
提问于 2011-11-01 20:08:08
回答 1查看 6.8K关注 0票数 0

对于一个MFC项目,我必须在一个单独的UI线程(CWinThread)中创建一个进度条对话框(CWinThread)。我从http://adilevin.wordpress.com/2009/06/29/user-interface-threads-in-mfc/站点上拿了这个例子。它自己工作。(基本上,它有两个进度条,一个来自主gui线程,一个在单独的ui线程中创建。该示例演示了在主gui线程中执行的计算不会干扰在ui线程中创建的进度条)。

但是,当我将代码放入我的应用程序中时,进度条就卡在了对SetPos的CProgressCtrl调用中。当我冻结主线程(当它正在运行计算时)时,我从Visual获得消息

进程似乎已陷入僵局(或没有运行任何用户模式代码)。所有线程都已停止。

所以看起来用户界面线程在等待主线程的消息吗?但我不知道它还在等什么。下面是ui线程的调用堆栈,它在其中被卡住了。

代码语言:javascript
运行
复制
user32.dll!GetPropW()  + 0x72 bytes 
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
user32.dll!SendMessageW()  + 0x4c bytes 
uxtheme.dll!DrawThemeParentBackgroundEx()  + 0x114 bytes    
comctl32.dll!GetEffectiveClientRect()  + 0x28f0 bytes   
comctl32.dll!GetEffectiveClientRect()  + 0x2916 bytes   
comctl32.dll!GetEffectiveClientRect()  + 0x2af3 bytes   
comctl32.dll!GetEffectiveClientRect()  + 0x2a25 bytes   
comctl32.dll!GetEffectiveClientRect()  + 0x2992 bytes   
user32.dll!gapfnScSendMessage()  + 0x270 bytes  
user32.dll!gapfnScSendMessage()  + 0x922 bytes  
user32.dll!FillRect()  + 0x110 bytes    
user32.dll!CallWindowProcA()  + 0x1b bytes  
mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg=15, unsigned int wParam=0, long lParam=0)  Line 1089 + 0x20 bytes    C++
mfc100d.dll!CWnd::WindowProc(unsigned int message=15, unsigned int wParam=0, long lParam=0)  Line 2088 + 0x1c bytes C++
mfc100d.dll!AfxCallWndProc(CWnd * pWnd=0x08156d68, HWND__ * hWnd=0x00012452, unsigned int nMsg=15, unsigned int wParam=0, long lParam=0)  Line 257 + 0x1c bytes C++
mfc100d.dll!AfxWndProc(HWND__ * hWnd=0x00012452, unsigned int nMsg=15, unsigned int wParam=0, long lParam=0)  Line 420  C++
cv32.dll!AfxWndProcDllStatic(HWND__ * hWnd=0x00012452, unsigned int nMsg=15, unsigned int wParam=0, long lParam=0)  Line 54 + 0x15 bytes    C++
user32.dll!gapfnScSendMessage()  + 0x270 bytes  
user32.dll!GetDC()  + 0x52 bytes    
user32.dll!GetWindowLongW()  + 0x18a bytes  
user32.dll!GetDC()  + 0xab bytes    
ntdll.dll!KiUserCallbackDispatcher()  + 0x2e bytes  
comctl32.dll!GetEffectiveClientRect()  + 0x2660 bytes   
comctl32.dll!RegisterClassNameW()  + 0x37e bytes    
user32.dll!gapfnScSendMessage()  + 0x270 bytes  
user32.dll!gapfnScSendMessage()  + 0x922 bytes  
user32.dll!FillRect()  + 0x110 bytes    
user32.dll!CallWindowProcA()  + 0x1b bytes  
mfc100d.dll!CWnd::DefWindowProcA(unsigned int nMsg=1026, unsigned int wParam=65, long lParam=0)  Line 1089 + 0x20 bytes C++
mfc100d.dll!CWnd::WindowProc(unsigned int message=1026, unsigned int wParam=65, long lParam=0)  Line 2088 + 0x1c bytes  C++
mfc100d.dll!AfxCallWndProc(CWnd * pWnd=0x08156d68, HWND__ * hWnd=0x00012452, unsigned int nMsg=1026, unsigned int wParam=65, long lParam=0)  Line 257 + 0x1c bytes  C++
mfc100d.dll!AfxWndProc(HWND__ * hWnd=0x00012452, unsigned int nMsg=1026, unsigned int wParam=65, long lParam=0)  Line 420   C++
cv32.dll!AfxWndProcDllStatic(HWND__ * hWnd=0x00012452, unsigned int nMsg=1026, unsigned int wParam=65, long lParam=0)  Line 54 + 0x15 bytes C++
user32.dll!gapfnScSendMessage()  + 0x270 bytes  
user32.dll!gapfnScSendMessage()  + 0x922 bytes  
user32.dll!GetWindow()  + 0x21a bytes   
user32.dll!SendMessageA()  + 0x4c bytes 
mfc100d.dll!CProgressCtrl::SetPos(int nPos=65)  Line 363 + 0x46 bytes   C++
cv32.dll!CProgressCtrlWithTimer::OnTimer(unsigned int nIDEvent=1)  Line 1577    C++

有人知道怎么回事吗?

当我单独运行示例应用程序时,它不会调用uxtheme.dll,因为它不在示例中使用。最后一个SendMessageW会是问题吗?

EN

回答 1

Stack Overflow用户

发布于 2011-11-02 13:41:28

SetPos意味着对SendMessage的调用,这是一个阻塞调用。您必须永远不要跨线程边界调用SendMessage,因为这注定会导致死锁。

如果需要更新运行在主线程上的GUI,则必须使用PostMessage

代码语言:javascript
运行
复制
PostMessage(hWndMain, UWM_MYMESSAGE, progress, 0);

并在主线程中处理消息:

代码语言:javascript
运行
复制
LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)
{
   m_progress.SetPos((int)wParam);
   return 1;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7972248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档