5

私のQtアプリケーションはサーバー側からデータパケットを継続的に受信しており、データに基づいてオブジェクトを構築しています。これらのオブジェクトを (一度に 1 つずつ) 3 つの異なるウィジェットに渡す必要があります。それで、1 つのシグナルを 3 つのウィジェットすべてのスロットに接続しましたが、そのようなオブジェクトを渡すのが安全かどうか疑問に思いますか? データ パケットが高速で到着すると仮定すると、これらは新しいデータ パケットで上書きされますか? これが原因でオブジェクトが破損したり、古いパケットの処理中に一部のパケットやデータが失われたりすることはありますか?

オーバーランが起こらないようにするメカニズムはありますか。また、データ パケットが非常に高速な場合、スロットリングが発生します。

4

3 に答える 3

6

単一の信号を複数のスロットに接続することは、Qt の設計機能です。

すべての (ほとんど?) Qt値クラスは参照カウントされるため、好きなだけ安全に渡すことができます。それらはほとんど「コピーオンライト」でもあるため、実際のパフォーマンスを損なうことなく、好きな場所に自由にコピーを作成できます。

他のマルチスレッド コードと同様に、複数のスレッドが同時に同じオブジェクトに書き込みを行う場合は注意が必要です。

于 2012-07-24T14:34:20.290 に答える
2

Qt のシグナルとスロットは、プログラムのイベント ループで処理されます。シグナルが発行されると、接続されたスロットのいずれかへの呼び出しがキューに入れられ、イベント ループのティック中に処理されます。シグナルを送信するためのオーバーヘッドは非常に低いです。Qt のドキュメントによると、1 つのスロットに接続すると 1 秒あたり約 2,000,000 の信号を送信でき、i586-500 の 2 つのスロットに接続すると 1,200,000 の信号を送信できます。着信データの処理は、シグナルの送信に費やされる時間と比較して、プログラムの応答時間のはるかに大きな部分を占める可能性があります。データ オブジェクトの構築がネットワークから入ってくる情報の速度に追いつくことができる限り、問題なく信号を発信できます。シグナルは受信オブジェクトのキューに追加され、イベント ループの次のパスで処理されます。

複数の受信者がパケット データを変更することを心配している場合は、参照やポインターではなく値でデータ オブジェクトをシグナルに渡すことによって、着信ネットワーク データの一意のコピーを送信している限り、次のように接続できます。スロットがデータを変更することを心配することなく、複数のスロット。

シグナルとスロットのメカニズムを使用して、着信ネットワーク データを処理し、グループの学校プロジェクトに大きな効果をもたらしました。UDP プロトコルを使用してクライアントと通信し、小惑星を連想させるマルチプレイヤー シューティング ゲームを実装します。シグナルとスロットを使用して、サーバーのさまざまなクラスにパケット データを配信することに問題はありませんでした。私が遭遇した問題のほとんどは、ゲームのネットコードのアルゴリズムの単純さが原因でした。(すべてがパケットごとに更新され、クライアント側のラグ補償はありません) 興味がある場合は、コードを公開してここで表示できます: http://foxx.arksaw.com/svn/tis/興味深いのは「netlib」です。 「サーバー」および「クライアント」ディレクトリ。

于 2012-07-24T14:55:53.963 に答える
1

これのネットワーク プログラミング部分についてはよくわかりませんが、信号とスロットに関する限り、1 つの信号を必要な数のスロットに接続できるはずです。

于 2012-07-24T14:18:49.473 に答える