4

私はQtを初めて使用するので、質問の単純さを許してください。しかし、Qtのスレッドについて少し混乱しています。3つのスレッドがあるとしましょう。メインのデフォルトのGUIスレッドと、自分で作成した2つのスレッド(WorkerThreadと呼ばれます)です。私の各WorkerThreadsはQThreadを継承し、永続的なスレッドであり、頻繁にウェイクアップしてデータをソケットに送信し、GUI要素にステータスを投稿します。1)GUIスレッドがWorkerThreadスレッドが使用できるWorkerThreadオブジェクトにデータを設定できるようにする最善の方法は何ですか?2)WorkerThreadがステータスをGUIスレッドに送信して、ユーザーに表示できるようにしますか?3)両方のWorkerThreadsが同じソケットを使用できるようにしますか?

ドキュメントから、WorkerThreadオブジェクトを作成すると、作成中のスレッドが所有しているように見えます(新しいスレッドであるrunメソッドを除く)。では、新しいスレッドを実行するためのデータをどのように設定するのでしょうか。新しいスレッドが使用するすべてのデータはグローバルである必要がありますか?たとえば、GUIで、ユーザーがウェイクアップ時に送信する各WorkerThreadのパケットタイプを選択できるようにしたいと思います。私は、GUIスレッドが通知するWorkerThreadのいくつかのスロットを配置すると想定していました。WorkerThreadオブジェクトがSetPacketTypeへのシグナルを受信すると、実行メソッドが各反復で参照するメンバー変数を設定します。しかし、ドキュメントを読んだ後、それがそれを行う方法かどうかはわかりません。WorkerThreadオブジェクトが作成スレッド(この場合はGUIスレッド)によって所有されている場合、それにシグナルを送信しません。

また、スレッド間でソケット接続を共有するための適切な手法は何ですか?

前もって感謝します。

4

1 に答える 1

4

Qt でスレッド間で情報を送信する最も簡単な方法は、シグナルとスロットを使用することです。Qt は、スレッド間の接続にキューに入れられたシグナルを自動的に使用します ( Qt::ConnectionTypeを参照)。これにより、1 つのスレッドからシグナルを送信できますが、スロットはレシーバー オブジェクトのスレッドで実行されます。

スレッド間で送信されるデータ (実行する作業またはステータス情報) が Qt が自動的にキューに入れることができるもの (たとえば、QStrings、int や double などの組み込み型など) である場合、その情報を引数としてsignal/slot は、情報を送信する最良の方法です。大規模または複雑なデータが共有されている場合は、qRegisterMetaTypeを使用して Qt がデータをコピーできるようにするか、スレッドセーフ オブジェクトへのポインターを渡す必要があります。Pie_Jesu が言ったこととは異なり、スレッドはアドレス空間を共有するため、ポインターを共有できます。あるスレッドの共有オブジェクトとの対話が別のスレッドの対話に干渉しないことを確認してください。

QTcpSocketはスレッドセーフではありません (Qt のドキュメントによると再入可能のみです)。そのため、ソケットを共有する場合は、スレッドが競合する方法でソケットを使用しないようにする必要があります。

于 2012-09-11T16:42:48.027 に答える