2012-10-28 19 views
0

我有一個使用兩個線程的C++ Win32應用程序。 線程A使用AllocConsole()創建控制檯窗口。 線程B使用WriteFile打印到控制檯手柄中(從GetStdHandle獲取)。Win32控制檯代碼在哪裏運行?從多線程使用控制檯掛起

由於某些原因,當兩個線程同時打印到控制檯時,我的進程掛起。

我該如何解決這個問題?是什麼導致了它? 我想調試控制檯的消息循環(這是一個窗口的權利?所以它應該有消息),但我不知道如何訪問它?

+3

得到任何代碼去與描述? – WhozCraig

+1

請您詳細說明'* ... gets hang。*'。 – alk

回答

2

既然你沒有提供任何代碼,我只是拋出一個受過教育的猜測在這裏:

據我所知推移, Win32控制檯類不是線程安全的(不像 System.Console類在.NET中它是線程安全的)。

這基本上意味着你應該做一些同步來防止任何錯誤;我不知道那裏是否存在這樣的問題。

請提供我們的代碼。

編輯:
請檢查Raymond Chen的評論。

+1

控制檯是線程安全的,但它是同步的。這意味着如果[一個線程正在從控制檯讀取,另一個線程無法寫入](http://blogs.msdn.com/b/oldnewthing/archive/2011/12/02/10243553.aspx)。 –

+0

因此,多次寫入應該會很好嗎? – Fingolfin

+0

每次寫入都等待先前的寫入完成。 –

0

我懷疑問題出在使用相同的設備句柄併發呼叫到WriteFile()

每個線程都需要它自己的設備句柄。只需在主線程中通過HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)將其拉出,然後在兩個線程中使用它以執行WriteFile(HANDLE, ...)肯定無法工作。

解決此問題的直接方法是使用CONOUT$通過調用CreateFile()來讓每個線程都有自己的值HANLDE

在OP的情況下,只有線程B需要通過調用CreateFile()來創建它自己的句柄,線程A可以使用由GetStdHandle()返回的值,因爲它分配了控制檯。

有關如何在「備註」部分爲「控制檯」創建控制檯的設備手柄see here