все!
У меня странная проблема в работе с 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?
Я проверяю состояние моего сокета, и оно не изменилось после Bound.
заранее спасибо
Qt :: QueuedConnection сообщает сигналу, который нужно добавить в очередь, не дожидаясь его обработки, прежде чем продолжить.
Если работа, которую вы выполняете над полученными данными, занимает некоторое время, возможно, скорость отправки слишком велика, чем скорость чтения, что приводит к большой очереди сигналов, поэтому система qt блокирует сигнал?
У меня нет времени на его тестирование, но то, что вы говорите об изменении таймера скорости передачи данных, заставляет меня думать, что это может быть что-то подобное.
Возможно, попробуйте измерить время, необходимое для обработки ваших данных, и попробуйте разные длины таймера отправки, чтобы проверить, можете ли вы проверить эту идею.
Других решений пока нет …