Как лучше всего получить данные из сокета по сигналу readyRead?

Я пишу программу Qt / C ++, которая получает данные из сокета. Я обнаружил, что теряю сигнал readyRead, потому что мой слот слишком долго анализирует поступающие данные. Так что теперь я свел это к минимуму:

void test::inputAvailable()
{
while (m_tcpSocket->bytesAvailable())
m_inputBuffer += m_tcpSocket->readAll();
emit(datawaiting());
}

Мои вопросы:

  1. Нужно ли защищать переменную m_inputBuffer мьютексом? Поскольку этот слот будет добавляться к нему, в то время как моя основная программа может удалять из него данные.
  2. Будет ли мьютекс слишком сильно замедлять мой слот, потому что мне нужно, чтобы он был быстрым. (чтобы не потерять сигнал ReadyRead)
  3. Является ли emit (последняя строка) правильным сигналом моей программе для анализа входящих данных? Или это приводит к тому, что моя программа повторно входит в цикл обработки событий, еще находясь в слоте (что приводит к потере сигнала)

я прочел этот похожий вопрос но никто не дал реального ответа.

1

Решение

  1. Поскольку это происходит в одно и то же время, будет полезна какая-то синхронизация доступа к переменным. В противном случае это может привести к неопределенному поведению.
  2. Это зависит от того, как долго основная программа будет занимать синхронизируемую переменную.
  3. Сигналы и слоты Qt помещаются в очередь цикла событий, следовательно, испуская datawaiting () n раз, в результате вы получите n раз выполненных слотов в паре с этим конкретным сигналом.
0

Другие решения

Зачем делиться глобальными переменными, вводить синхронизацию и т. Д., Когда вы можете просто прочитать переменную и передать ее обработчику.

void test::inputAvailable()
{
while (m_tcpSocket->bytesAvailable())
QByteArray data  += m_tcpSocket->readAll();
emit datawaiting(data);
}
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector