以下をラップするネットワーク ライブラリを作成していますQUdpSocket
。
QAbstractSocket *UdpNetworkStreamer::addConnection()
{
QUdpSocket *udpSocket = new QUdpSocket(this);
udpSocket->bind(connection.port, QUdpSocket::ShareAddress);
bool ret = udpSocket->joinMulticastGroup(QHostAddress(connection.ip));
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::QueuedConnection);
return udpSocket;
}
- 新しい を作成します
QUdpSocket
。 readyRead
その信号に接続します。readDatagram
が発生したときに呼び出しますreadyRead
。
Qt GUI アプリケーションからライブラリを使用すると、すべて正常に動作します。
別のユーザーが Qt GUI アプリケーションの外部で使用されるライブラリをインクルードすると、問題が発生します。
彼は を呼び出しますaddConnection
(ソケットを作成し、 で connect を呼び出しますreadyRead
) 。
が呼び出されるスレッドaddConnection
は非 Qt です。
はaddConnection
正常に終了したように見えますが、readyRead
は決して出力されません。
read を呼び出すと (noreadyRead
が発行された場合でも)、データグラムの読み取りが成功します。
機能しなかった修正:
UDP ソケット スレッドを this->thread に移動する
QUdpSocket *udpSocket = new QUdpSocket(); udpSocket->moveToThread(this->thread()); udpSocket->setParent(this);
void を呼び出して問題をシミュレートしようとしました
MainWindow::on__btnOpenMulticastReceiver_clicked() { QFuture<void> future = QtConcurrent::run(this, &MainWindow::CreateMulticastConnection, testHandle); }
これにより、ユーザーが私のライブラリで経験したのと同じ症状が発生しました。つまり、
readyRead
が出力されませんでした。QSignalSpy
- 信号でスパイを起動しましたreadyRead
; ソケットから直接データを読み取ることはできましたが、カウンターはゼロのままでした。メイン スレッドでソケットが初期化されている場合、スパイは有効な結果 (進行) を返しました。
私の質問:
- 私は何が欠けていて、間違っていますか?
- メインの GUI スレッドで作成されていない場合でも、発行する最も簡単な方法は何ですか?
readyRead
GUI なしまたは Qt スレッドの外部で動作するサンプルは見つかりませんでした。