Delphi XE2、Indy V10、Windows 7 Pro-しかし、私には一般的な概念上の問題があると思います。
- IndyのTCPクライアントは同期的です-ブロッキング呼び出しを使用します。
- ただし、アプリケーションの一部は非同期です-TCPを介してデータを送信し、次の場合に応答を待ちます
A)サードパーティのシリアルポートコンポーネントがシリアルポートからの入力を報告します(非同期のようで、独自のスレッドで実行され、メッセージを投稿しますアプリケーションのメインフォームのWindowsメッセージキューに)および
B)いくつかのタイマーの1つが期限切れになったとき(非同期でもあります) 私のアプリケーションによるこれらの非同期イベントの処理では、TCPを介してデータを送信し、次のTCPデータを送信する前に応答を取得するために、ブロッキング呼び出しを行う必要があります。例えば
procedure OnSerialPortRxChar(...); begin if SendTCpData(...) = 'OK' then ... end; procedure OnTimerExpiry(...); begin if SendTCpData(...) = 'OK' then ... end;
これらは互いに割り込むべきではありませんが、現在は割り込んでいます。
明らかに、私の関数にSendTCpData
は、再入可能な呼び出しを防ぐための何らかのブロックメカニズム、またはキューイングメカニズムが必要です。発信者が結果を知る必要があるとすると、私の最善の解決策はミューテックスですか?SendTCpData
問題は、TCPトランザクションが、これらの非同期イベントが呼び出すことができる20行の関数の1行にすぎないことです。
これをわかりやすく説明できたと思います。そうでない場合は、詳細をリクエストしてください。
よろしくお願いします。