1

以下をラップするネットワーク ライブラリを作成しています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;
}
  1. 新しい を作成しますQUdpSocket
  2. readyReadその信号に接続します。
  3. readDatagramが発生したときに呼び出しますreadyRead

Qt GUI アプリケーションからライブラリを使用すると、すべて正常に動作します。

別のユーザーが Qt GUI アプリケーションの外部で使用されるライブラリをインクルードすると、問題が発生します。

彼は を呼び出しますaddConnection (ソケットを作成し、 で connect を呼び出しますreadyRead) 。

が呼び出されるスレッドaddConnectionは非 Qt です。

addConnection正常に終了したように見えますが、readyReadは決して出力されません。

read を呼び出すと (noreadyReadが発行された場合でも)、データグラムの読み取りが成功します。

機能しなかった修正:

  1. UDP ソケット スレッドを this->thread に移動する

    QUdpSocket *udpSocket = new QUdpSocket();
    udpSocket->moveToThread(this->thread());
    udpSocket->setParent(this);
    
  2. void を呼び出して問題をシミュレートしようとしました

    MainWindow::on__btnOpenMulticastReceiver_clicked()
    {
       QFuture<void> future = QtConcurrent::run(this, 
       &MainWindow::CreateMulticastConnection, testHandle);
    }
    

    これにより、ユーザーが私のライブラリで経験したのと同じ症状が発生しました。つまり、readyReadが出力されませんでした。

  3. QSignalSpy- 信号でスパイを起動しましたreadyRead; ソケットから直接データを読み取ることはできましたが、カウンターはゼロのままでした。メイン スレッドでソケットが初期化されている場合、スパイは有効な結果 (進行) を返しました。

私の質問:

  1. 私は何が欠けていて、間違っていますか?
  2. メインの GUI スレッドで作成されていない場合でも、発行する最も簡単な方法は何ですか? readyReadGUI なしまたは Qt スレッドの外部で動作するサンプルは見つかりませんでした。
4

2 に答える 2