Задержка отправки QWebSocketServer

#c #qt #websocket

#c #qt #websocket

Вопрос:

У меня есть класс обработки изображений с QWebSocketServer в нем. Когда я начинаю обработку изображения, я отправляю сообщение START_PROCESSING. Когда обработка завершена, я отправляю сообщение О результатах. Что происходит, так это то, что оба сообщения отправляются в конце обработки, одно за другим.

В первом тесте я только что вызвал функцию отправки, когда они должны быть вызваны. Затем я протестировал подход с отправкой сигнала emit / catch, но без дополнительного потока (emit / catch из того же основного потока); тот же результат, теперь моя идея состоит в том, чтобы запустить отдельный поток, который перехватывает отправку и отправляет сообщения. Может ли это быть хорошим подходом? Или я просто что-то упускаю в отношении «механики» отправки сообщений?

Ответ №1:

Если вы не войдете в цикл событий, QWebSocket ничего не отправит и не получит.

Три варианта:

  1. Перенесите обработку изображений во второй поток.
  2. Используйте второй поток для QWebSocket. Чтобы избежать условий гонки, используйте механизм signal-slot-mechanism для отправки ваших данных в QWebSocket в другом потоке.
  3. Вызовите QCoreApplication::processEvents() внутри вашей обработки изображений.

Первый вариант в большинстве случаев является наилучшим. Второе может быть хорошей идеей, если у вас большая нагрузка на QWebSocket. Третий вариант возможен, если вы должны быть однопоточными.

Комментарии:

1. Я думаю, что выберу вариант 2 (тот, о котором я говорил в своем посте). Глупый вопрос: как перевести поток в «состояние ожидания» сигналов? Глупый вариант: перевести поток в спящий режим на бесконечное время => проблема с закрытием потока!

2. Вам не обязательно. Если вы не перезаписываете run(), QThread автоматически запускает цикл обработки событий, и если вы перезаписываете run(), добавьте в последнюю строку exec(). Вам нужно либо создать свой QWebSocket внутри потока, либо использовать moveToThread().