TIdTCPServer および TIdTCPClient コンポーネントを使用して Windows サービスと VCL アプリケーションを通信し (ログを送信する)、すべて正常に動作していますが、サービスはマルチスレッドであるため、ログ (メッセージ文字列) を送信するたびにVCL アプリケーションに対して、サービスでコンポーネント (TIdTCPClient) の新しいインスタンスを作成する必要があります。問題は、これを回避し、 TIdTCPClient
ウィンドウ サービス側でコンポーネント の一意のインスタンスを 1 つだけ使用するにはどうすればよいかということです。
質問する
196 次
1 に答える
2
TIdTCPClient
複数のスレッドがまったく同時にメッセージを送信できず、誤って互いにオーバーラップしないように、単一のインスタンスを作成してアクセスをシリアル化するだけで済みます。
TIdTCPClient
を独自の専用スレッドに移動することをお勧めします。これは、接続状態を監視し、サーバーがダウンしたり再起動したりした場合に自動的に再接続できるスレッドですTIdThreadSafeStringList
。TIdTCPClient
チェックを定期的にキューに入れ、必要に応じて送信します。そうすれば、ワーカー スレッドは にTIdTCPClient
直接アクセスせず、接続がダウンしている間も、接続が再確立されたときに送信するメッセージを収集できます。
アプリ側では、サービスから一度に 1 つの接続のみを受け入れることができる場合、使用TIdTCPServer
は少しやり過ぎかもしれません。TIdSimpleServer
代わりに使用することを検討してください。
于 2013-08-15T01:24:24.803 に答える