调试方法AttachThreadInput()时Visual Studio 2010挂起

时间:2011-11-10 06:01:54

标签: c++ visual-studio-2010 debugging mfc hang

我有Visual Studio 2010 Ultimate SP1,我的项目基于MFC。

当我调试我的项目的下一个代码时,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按钮,则VS会立即挂起。

可能是什么问题?

1 个答案:

答案 0 :(得分:34)

我怀疑你刚从某个地方复制了这段代码而没有理解后果。这是我在2005年讨论过的Five Things Every Win32 Programmer Should Know之一。

AttachThreadInput的意思是“请从这两个主题中取出所有的钱并将它们放在一个联合银行账户中,这样两个线程都不会提取任何钱,除非两个线程一起去银行取钱。”

如果两个线程结婚或者是同一个家庭的成员或者用共享的银行账户互相信任,这也很好,并且还可以协调他们的行动,这样当他们中的一个需要钱时,它可以调用另一个并说:“嘿,你能和我一起去银行吗?我需要一些钱。”

在你的情况下,你说,“请把我所有的钱和所有钱从一些随便的人走在街上并把它们放到一个联合的银行账户中,这样我既不会也不会除非我们俩一起去银行取钱,否则其他人可以提取任何款项。“

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

将“银行帐户”更改为“输入队列”,将“金钱”更改为“输入”,并“转到银行”以“检查邮件队列”。

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

您的设计存在根本缺陷。你需要重新审视自己的情况。

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