2011-11-10 82 views
3

我有Visual Studio 2010 Ultimate SP1,我的项目基于MFC。当我调试方法时,Visual Studio 2010会挂起AttachThreadInput()

当我调试运行我的项目的下一个代码Visual Studio是挂起:

CWnd* _window = CWnd::FromHandle(_hwnd_); 
if (_window) { 
    DWORD nForeThread, nAppThread; 

    nForeThread = ::GetWindowThreadProcessId(::GetForegroundWindow(), 0); 
    nAppThread = GetCurrentThreadId(); 

    if (nForeThread != nAppThread) 
    { 
     AttachThreadInput(nForeThread, nAppThread, TRUE); 
     _window->BringWindowToTop(); 
     _window->ShowWindow(SW_RESTORE); 
     AttachThreadInput(nForeThread, nAppThread, FALSE); 
    } 
    else 
    { 
     _window->BringWindowToTop(); 
     _window->ShowWindow(SW_RESTORE); 
    } 
} 

我对下一行断点:

AttachThreadInput(nForeThread, nAppThread, TRUE); 

所以,如果我按F10或F11或F5 button ,那么VS立即挂起。

可能是什么问题?

+0

首先,你不检查返回码,'AttachThreadInput'可能会失败,你应该经常检查。其次,我的猜测是,VS2010(你将附加到你的线程中的线程)做了一些与此调用或输入事件处理不兼容的事情。 –

+0

调用AttachThreadInput后,我无法获得返回值,VS挂起... – Swan911

+0

关于后者,很有可能。所以我问问该怎么做? – Swan911

回答

33

我怀疑你是从某处复制了这段代码而不理解后果。这是Five Things Every Win32 Programmer Should Know我讨论早在2005年

AttachThreadInput的意思是“请把所有的钱来自这两个线程,并把它们放到一个共同的银行账户,所以除非两个线程去两个线程可以提取任何款项之一银行一起收回这笔钱。“

这是非常好的,如果两个线程已婚或同一家庭的成员或以其他方式互相信任共享银行账户,并且可以协调他们的行为,以便当他们中的一个需要钱时,可以拨打另一个一个人说:“嘿,你能和我一起去银行吗?我需要一些钱。”

在你的情况,你说:“请把我所有的所有的钱,所有的钱从一些素不相识的人走在街上并把它们纳入一个共同的银行账户,这样无论是我还是其他人即可除非我们两人一起去银行取钱。“

这对你和其他人来说都是一个坏主意,因为除非你能够与对方取得联系,否则你现在不能提取任何款项。但既然你刚抓住一个随便的人走在街上,你不知道他的手机号码,所以你无法联系他说:“嘿,你能和我一起去银行吗?”那个随机的人现在可以访问你所有的银行账户信息。 (而且你的钱和那个人的钱被混为一谈 - 这不是“你的钱”和“那个人的钱”,它只是一堆钱。)

将“银行账户”更改为“输入排队“,”钱“到”输入“,”去银行“去”检查消息队列“。

就你而言,你所做的是抓住Visual Studio,并说:“好吧,我们现在有一个联合银行账户!”现在看看会发生什么:Visual Studio不能提取任何钱,因为它需要你去银行。但是你不能去银行,因为你陷入了调试器。结果:没有人得到任何钱。

您的设计存在根本上的缺陷。你需要重新检查你的情况。

另请参阅:I warned you: The dangers of attaching input queues

+0

这是在哪里C#的System.Windows.Forms.Control的InvokeRequired BeginInvoke/Invoke结束了吗? –

+2

@CS我不确定你在哪里看到任何连接。如果您有任何问题,请提出一个新问题,不要征用现有问题。 –

+0

这是一个过度的隐喻。它几乎没有解释这个问题。它看起来像讲故事。 – GetFree

相关问题