Visual Studio 2010 зависает при отладке метода AttachThreadInput () - PullRequest
3 голосов
/ 10 ноября 2011

У меня 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 Ответ

34 голосов
/ 10 ноября 2011

У меня есть подозрение, что вы просто скопировали этот код откуда-то, не понимая последствий. Это одна из пяти вещей, которые должен знать каждый программист Win32 , о которых я говорил в 2005 году.

AttachThreadInput означает «Пожалуйста, возьмите все деньги из этих двух потоков и поместите их на совместный банковский счет, чтобы ни один из потоков не мог снять деньги, если только оба потока не отправятся в банк вместе, чтобы вывести деньги».

Это замечательно, если два потока состоят в браке или являются членами одной семьи или иным образом доверяют друг другу общий банковский счет, а также могут координировать свои действия так, чтобы, когда одному из них нужны деньги, он мог позвонить другому. и скажи: «Эй, не могли бы вы пойти со мной в банк? Мне нужны деньги».

В вашем случае вы сказали: «Пожалуйста, заберите все мои деньги и все деньги у случайного человека, идущего по улице , и положите их на совместный банковский счет, чтобы ни я, ни этот другой человек может снять любые деньги, если мы оба не пойдем в банк вместе, чтобы забрать деньги. "

Это плохая идея, как для вас, так и для другого человека, поскольку теперь вы не можете снять деньги, если вам не удастся связаться с другим человеком. Но так как вы только что схватили случайного человека, идущего по улице, вы не знаете номер его мобильного телефона, поэтому у вас нет возможности связаться с ним, чтобы сказать: «Эй, ты можешь пойти со мной в банк?» И этот случайный человек теперь имеет доступ ко всей информации вашего банковского счета. (И ваши деньги, и деньги этого другого человека слились воедино - это уже не «ваши деньги» и «деньги этого другого человека». Это всего лишь одна куча денег.)

Измените «банковский счет» на «очередь ввода», «деньги» на «ввод» и «перейти в банк» на «проверку очереди сообщений».

В вашем случае вы взяли Visual Studio и сказали: «Хорошо, теперь у нас есть совместный банковский счет!» Посмотрите, что происходит: Visual Studio не может снять деньги, потому что вам нужно, чтобы вы пошли в банк. Но вы не можете пойти в банк, потому что вы сломаны в отладчике. Результат: никто не получает денег.

Ваш дизайн в корне неверен. Вам нужно пересмотреть вашу ситуацию.

См. Также: Я предупреждал вас: Опасность присоединения входных очередей .

...