2011-11-10 115 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

相關問題