2016-08-02 54 views
0

大家好!QUdpSocket高速郵件閱讀

我與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 :: QueuedConne解決了我的問題但今天我在我的項目中添加了另一個小部件並每100毫秒更新一次。我不知道如何,但2秒後我的插槽沒有再發出信號。

如果我改變我的計時器間隔或發送數據速率到1秒,一切都很好。

所有我的類和我的小部件住在主程序的線程中,我不使用另一個線程,但它似乎我應該!

那麼爲什麼Qt eventloop會丟失信號?

我檢查我的套接字狀態,並且在綁定後沒有改變。

在此先感謝

+0

也許你的程序卡在'while(udp_listener-> hasPendingDatagrams())'循環中? – thuga

+0

沒有我的桂是響應所有類型的信號 – danics

+1

我發現[this](https://bugreports.qt.io/browse/QTBUG-46552)和[此錯誤報告](https://bugreports.qt.io /瀏覽/ QTBUG-48556)這似乎有關。 – thuga

回答

1


的Qt :: QueuedConnection告訴信號被添加到隊列中,而不是等待它繼續之前進行處理。
如果您對接收到的數據所做的工作需要一些時間,也許發送速率比讀取速率高得多,導致信號隊列很大,因此qt系統會阻止信號?

沒有時間去測試它,但是你怎麼說改變數據速率計時器讓我覺得它可能是這樣的。

也許嘗試測量您需要處理您的數據的時間,並嘗試一些不同的發送計時器長度來測試您是否可以驗證此想法。

+0

如何找到當前的信號隊列情況?我不明白爲什麼會發生所有readBuffers函數在.6毫秒運行 – danics

+0

我錯了我的Qt版本!這是Qt 5.5我更新到5.7,沒有QueueConneciton一切正常; :)) – danics

+0

@danics啊那麼你去那麼。該錯誤報告稱它在5.5.1中修復,而不是5.5。 – thuga