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

Swa*_*911 3 c++ debugging mfc hang visual-studio-2010

我有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在下一行有一个断点:

    AttachThreadInput(nForeThread, nAppThread, TRUE);
Run Code Online (Sandbox Code Playgroud)

因此,如果我按下F10或F11或F5按钮,则VS会立即挂起.

可能是什么问题呢?

Ray*_*hen 34

我怀疑你只是从某个地方复制了这个代码而没有理解后果.这是Win32程序员应该知道五件事之一我在2005年讨论过.

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

这是巨大的,如果两个线程都结婚或同一家庭的成员或以其他方式相互信任与共享的银行帐户,也可以协调他们的行动,这样,当其中一人需要钱,它可以调用另一个说"嘿,你能和我一起去银行吗?我需要一些钱."

在你的情况下,你说,"请把我所有的钱和所有的钱从一些随便的人走到街上并把它们放入一个联合银行账户,以便我和那个其他人都不能提取任何钱,除非两者都我们一起去银行取钱."

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

将"银行帐户"更改为"输入队列",将"金钱"更改为"输入",并"转到银行"以"检查消息队列".

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

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

另请参阅:我警告过您:附加输入队列的危险.

  • @CS我不确定你在哪里看到任何联系.如果您有疑问,请提出新问题,不要提出现有问题. (3认同)
  • 这是多余的比喻。勉强能说明问题。看起来就像是在讲故事。 (2认同)