0

2つのスレッドを使用するC++のWin32アプリがあります。スレッドAは、を使用してコンソールウィンドウを作成しますAllocConsole()。スレッドBWriteFileは、コンソールハンドル(から取得GetStdHandle)を使用してこのコンソールに出力します。

何らかの理由で、両方のスレッドがコンソールに同時に印刷されると、プロセスがハングします。

このハングを修正するにはどうすればよいですか?何が原因ですか?コンソールのメッセージループをデバッグしたいのですが(ウィンドウが正しいので、メッセージが表示されるはずです)、アクセス方法がわかりません。

4

2 に答える 2

2

あなたはコードを提供しなかったので、私はここに知識に基づいた推測を投げます:

私の知る限り、 Win32コンソールクラスはスレッドセーフではありません(スレッドセーフである.NETのSystem.Consoleクラスとは異なります)。

これは基本的に、エラーを防ぐために同期を行う必要があることを意味します。でも、そこにぶら下がっているのがそのような問題によるものなのかどうかはわかりません。

コードを教えてください。

編集:
レイモンド・チェンのコメントを確認してください。

于 2012-10-28T15:45:35.253 に答える
0

への同時呼び出しによる同じデバイス ハンドルの使用に問題があると思われWriteFile()ます。

各スレッドには、独自のデバイス ハンドルが必要です。メインスレッドでプルしてからHANDLE = GetStdHandle(STD_OUTPUT_HANDLE)両方のスレッドで使用するだけでは、WriteFile(HANDLE, ...)確実に機能しません。

これを回避する簡単な方法は、各スレッドにusing をHANLDE呼び出して独自の値を持たせることです。CreateFile()CONOUT$

OP の場合、スレッド B のみが を呼び出して独自のハンドルを作成する必要があり、スレッド Aはコンソールを割り当てたときCreateFile()に によって返された値を使用できます。GetStdHandle()

コンソール用のデバイスハンドルの作成方法については、「備考」セクションの「コンソール」についてはこちらを参照してください。

于 2012-10-28T16:28:06.230 に答える