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 такой что:

  • Либо он потребляет большие порции. Например, если производитель уведомляет после написания каждого символа, потребитель может прийти и прочитать все доступные символы одновременно.
  • Либо это сбрасывает некоторые данные.
Другие вопросы по тегам