0

私はマルチユーザーのリモート管理ツールを作成しています.VNCのようなものですが、Teamviewerのようにマルチリモートデスクトップビューアーをサポートしています.

TListview のみを含む Delphi フォームがあります。このリストビューには、現在サーバーに接続されているユーザー リストが含まれています。

接続が切断されると、リストビュー アイテムが削除されます。

何らかの理由で、複数のアイテムを削除しているときにランダムな問題が発生しました。たとえば、サーバー接続全体をフラッシュすることにした場合、リストビュー アイテムが複数ある場合、おかしくなり始めます。

エラーが表示されないこともあれば、一部のアイテムがリストされたままになることもあれば、「アドレス違反エラー」が表示されることもあります。

以前は純粋な Winsock API を使用してクライアント/サーバー アプリケーションを作成していたので、おそらく Indy コンポーネントをうまく使用していません。

サーバー コンポーネントの管理方法について簡単に説明します。

私のアプリケーションはマルチサーバーです。つまり、ユーザーは 1 つまたは複数のサーバーを同時に作成できます。ユーザーが新しいサーバーを作成すると、新しいインディ サーバー コンポーネントを作成し、必要なイベント (OnConnect、OnExecute、OnDisconnect) などをセットアップする新しいスレッドを実行します。

いくつかの VCL 形式で動作するすべてのコマンドは、もちろん、Synchronize() を使用して同期します。デルフィ法。

新しい接続が表示されたら、Server Execute メソッドから新しいリストビュー項目を作成し、新しいリストビュー項目を AContext.data プロパティに設定します。

OnDisconnect イベントで接続がドロップされると、リストビュー項目を削除してから AContext データを空にして、自動的に破棄されるときに再度実行しないようにします。

Synchronize(procedure begin
TListItem(AContext.data).Delete;
end);
AContext.data := nil;

複数の接続がある場合、この方法は非常にうまく機能しません。デバッグ後、同期コマンドが同時に実行され、VCL フォームで競合が発生する可能性があります。

私は Indy10 の専門家ではありません。アドバイスをいただければ幸いです。

4

1 に答える 1