質問

OutputDebugString(PAnsiChar(''));

スレッドは安全ですか?

私/私たちはこれをデバッグ用のスレッドで使用してきましたが、別の方法で使用する必要があるかどうかは考えもしませんでした。

(デルフィ 7)

役に立ちましたか?

解決

心配しないでください。

OutputDebugstring()がアプリケーションによって呼び出されると、これらの手順が取られます。任意の時点での障害は、全体を廃止し、デバッグリクエストをNO-OPとして扱うことに注意してください(文字列はどこにも送信されません)。

  1. DBWinMutex を開き、排他的にアクセスできるようになるまで待ちます。
  2. DBWIN_BUFFER セグメントをメモリにマップします。発見されていない場合、デバッガーが実行されていないため、リクエスト全体が無視されます。
  3. DBWIN_BUFFER_READY イベントと DBWIN_DATA_READY イベントを開きます。共有メモリセグメントと同様に、オブジェクトの欠落はデバッガーが利用できないことを意味します。
  4. DBWIN_BUFFER_READY イベントが通知されるまで待ちます。これは、メモリバッファーが使用されなくなったことを示しています。ほとんどの場合、このイベントは検査時にすぐに合図されますが、バッファーが準備が整うまで10秒以上待つことはありません(タイムアウトはリクエストを捨てます)。
  5. メモリバッファーに最大約4kバイトのデータをコピーし、現在のプロセスIDもそこに保存します。常に文字列の最後にヌルバイトを置きます。
  6. DBWIN_DATA_READYイベントを設定して、バッファの準備が整っていることをデバッガーに伝えます。デバッガーはそこからそれを取得します。
  7. ミューテックスを解放する
  8. イベントとセクションのオブジェクトを閉じますが、後でミューテックスのハンドルを保持します。

他のヒント

まあ、それは真実ではないではないこと、それがあるが、ちょうどそのようにあなたはそれのためにリーフェンワードを取る必要はありません。

  

との間のデータの受け渡し   アプリケーションとデバッガが行われます   共有メモリの4Kバイトのチャンクを経由して、   ミューテックスと2つのイベントオブジェクトを持ちます   それへのアクセスを保護します。これらは、   4つのカーネルオブジェクト関わっています。

のWin32のOutputDebugString を理解することは、この問題に関する優れた記事です。

私は、ISAPI DLL内の文字列で、しかし、一度トラブルがありました。いくつかの奇妙な理由ではSystem.pasで定義されてIsMultiThreadブールが設定されませんでした!

スレッドが複数のスレッドを実行していた後、

これは、奇妙なAccessViolationsを引き起こしていた...単純な「IsMultiThread:=真;」ユニットに初期化はそれを修正します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top