Delphi では、OutputDebugString はスレッド セーフですか?
-
21-08-2019 - |
質問
は
OutputDebugString(PAnsiChar(''));
スレッドは安全ですか?
私/私たちはこれをデバッグ用のスレッドで使用してきましたが、別の方法で使用する必要があるかどうかは考えもしませんでした。
(デルフィ 7)
解決
心配しないでください。
OutputDebugstring()がアプリケーションによって呼び出されると、これらの手順が取られます。任意の時点での障害は、全体を廃止し、デバッグリクエストをNO-OPとして扱うことに注意してください(文字列はどこにも送信されません)。
- DBWinMutex を開き、排他的にアクセスできるようになるまで待ちます。
- DBWIN_BUFFER セグメントをメモリにマップします。発見されていない場合、デバッガーが実行されていないため、リクエスト全体が無視されます。
- DBWIN_BUFFER_READY イベントと DBWIN_DATA_READY イベントを開きます。共有メモリセグメントと同様に、オブジェクトの欠落はデバッガーが利用できないことを意味します。
- DBWIN_BUFFER_READY イベントが通知されるまで待ちます。これは、メモリバッファーが使用されなくなったことを示しています。ほとんどの場合、このイベントは検査時にすぐに合図されますが、バッファーが準備が整うまで10秒以上待つことはありません(タイムアウトはリクエストを捨てます)。
- メモリバッファーに最大約4kバイトのデータをコピーし、現在のプロセスIDもそこに保存します。常に文字列の最後にヌルバイトを置きます。
- DBWIN_DATA_READYイベントを設定して、バッファの準備が整っていることをデバッガーに伝えます。デバッガーはそこからそれを取得します。
- ミューテックスを解放する
- イベントとセクションのオブジェクトを閉じますが、後でミューテックスのハンドルを保持します。
他のヒント
まあ、それは真実ではないではないこと、それがあるが、ちょうどそのようにあなたはそれのためにリーフェンワードを取る必要はありません。
との間のデータの受け渡し アプリケーションとデバッガが行われます 共有メモリの4Kバイトのチャンクを経由して、 ミューテックスと2つのイベントオブジェクトを持ちます それへのアクセスを保護します。これらは、 4つのカーネルオブジェクト関わっています。
のWin32のOutputDebugString を理解することは、この問題に関する優れた記事です。
私は、ISAPI DLL内の文字列で、しかし、一度トラブルがありました。いくつかの奇妙な理由ではSystem.pasで定義されてIsMultiThreadブールが設定されませんでした!
スレッドが複数のスレッドを実行していた後、これは、奇妙なAccessViolationsを引き起こしていた...単純な「IsMultiThread:=真;」ユニットに初期化はそれを修正します。
所属していません StackOverflow