singleHow, как Qt::QueuedConnection работает в однопоточном приложении?
Я делаю:
connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(onTCPDataArrived()), Qt::QueuedConnection);
Но время вызова слота намного меньше, чем должно быть.
Кажется, что пропущено много сигналов, вероятно, потому что слот занимает много времени (это делает).
Я добавил задержку 2 мс на стороне передачи между записями tcp, и она стала лучше: слот вызывается чаще.
Вопрос: если сигнал и слот находятся в одном потоке, приемник все еще ставит в очередь входящие сигналы, когда слот уже запущен?
2 ответа
С TCP/IP нет никаких гарантий относительно того, как данные будут разделены на пакеты на принимающей стороне. Таким образом, вы можете отправить 10 байтов "все сразу", а принимающей стороне разрешено получать от 10 уведомлений (по одному на каждый байт) до 0 уведомлений. Почему ноль? Потому что вскоре вы можете отправить еще 10 байтов, и для всех 20 из них будет одно уведомление. Это никак не связано с Qt.
Так когда readyRead()
пожары, вы должны прочитать все данные, которые доступны для чтения. Вы не будете уведомлены об этих данных снова.
Документация Qt::QueuedConnection предусматривает
Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполняется в потоке получателя.
Это поведение не зависит от потока, инициирующего сигнал (не в случае со всеми типами соединений).
То, что вы испытываете, является производителем tcpSocket
который производит с большей скоростью, чем потребитель this
, Как вы сказали onTCPDataArrived
займет много времени.
Вы должны изменить onTCPDataArrived
такой что:
- Либо он потребляет большие порции. Например, если производитель уведомляет после написания каждого символа, потребитель может прийти и прочитать все доступные символы одновременно.
- Либо это сбрасывает некоторые данные.