1

みんな!

QUdpSocket と readyRead シグナルの操作に奇妙な問題があります。思ったように機能していないと言えます。

QUdpSocket を作成してポートにバインドし、readyRead シグナルをスロットに接続して、以下のように保留中のデータグラムをすべて読み取ります。

if(!udp_listener)
{
      udp_listener = new QUdpSocket(this);
      connect(udp_listener, SiGNAL(readyRead()), this, SLOT(readBuffers(), Qt::QueuedConnection);
      // the rate of receiving data is 10 msec if i dont put Qt::QueuedConnection, it didn't receive any more signal after first received. why ???
      // change the rate of data to 1 sec and this code work well without Qt::QueuedConnection !!! 
}

udp_lister.bind(Any, 5555);

そして私のreadBuffersコード

void readBuffers() {
    QString buffer;
    while(udp_listener->hasPendingDatagrams()) {
           QByteArray received;
           received.resize(udp_listener->pendingDatagramSize());
           udp_listener->readDatagram(received, received.size(), 0,0);
           buffer.append(received);
           // Do some job in 1 msec on buffer and take data from buffer
           if(/* some works done */) buffer.clear(); // almost every time my buffer got cleared 
    }
}

Qt::QueuedConnection を使用して問題を解決したと思っていましたが、今日、プロジェクトに別のウィジェットを追加し、100 ミリ秒ごとに更新しました。方法はわかりませんが、スロットが 2 秒後に信号を出さなくなりました。

タイマー間隔または送信データ レートを 1 秒に変更すると、すべて問題ありません。

すべてのクラスとウィジェットはメイン プログラムのスレッドにあり、別のスレッドは使用していませんが、使用する必要があるようです。

では、Qt eventloop によってシグナルがドロップされたのはなぜですか?

ソケットの状態を確認しましたが、バウンド後に変化しませんでした。

前もって感謝します

4

1 に答える 1

1


Qt::QueuedConnection は、信号が処理されるのを待たずにキューに追加されるように指示します。
受信したデータに対して行う作業に時間がかかる場合は、送信速度が読み取り速度よりも高すぎて、信号キューが大きくなり、qt システムが信号をブロックする可能性がありますか?

それをテストする時間はありませんが、データ レート タイマーの変更についてあなたが言っていることは、それがそのようなものである可能性があると私に思わせます.

データの処理に必要な時間を測定し、さまざまな送信タイマーの長さを試して、この考えを検証できるかどうかをテストしてみてください。

于 2016-08-02T13:36:38.747 に答える