#c #qt #websocket
#c #qt #websocket
Вопрос:
У меня есть класс обработки изображений с QWebSocketServer в нем. Когда я начинаю обработку изображения, я отправляю сообщение START_PROCESSING. Когда обработка завершена, я отправляю сообщение О результатах. Что происходит, так это то, что оба сообщения отправляются в конце обработки, одно за другим.
В первом тесте я только что вызвал функцию отправки, когда они должны быть вызваны. Затем я протестировал подход с отправкой сигнала emit / catch, но без дополнительного потока (emit / catch из того же основного потока); тот же результат, теперь моя идея состоит в том, чтобы запустить отдельный поток, который перехватывает отправку и отправляет сообщения. Может ли это быть хорошим подходом? Или я просто что-то упускаю в отношении «механики» отправки сообщений?
Ответ №1:
Если вы не войдете в цикл событий, QWebSocket ничего не отправит и не получит.
Три варианта:
- Перенесите обработку изображений во второй поток.
- Используйте второй поток для QWebSocket. Чтобы избежать условий гонки, используйте механизм signal-slot-mechanism для отправки ваших данных в QWebSocket в другом потоке.
- Вызовите QCoreApplication::processEvents() внутри вашей обработки изображений.
Первый вариант в большинстве случаев является наилучшим. Второе может быть хорошей идеей, если у вас большая нагрузка на QWebSocket. Третий вариант возможен, если вы должны быть однопоточными.
Комментарии:
1. Я думаю, что выберу вариант 2 (тот, о котором я говорил в своем посте). Глупый вопрос: как перевести поток в «состояние ожидания» сигналов? Глупый вариант: перевести поток в спящий режим на бесконечное время => проблема с закрытием потока!
2. Вам не обязательно. Если вы не перезаписываете run(), QThread автоматически запускает цикл обработки событий, и если вы перезаписываете run(), добавьте в последнюю строку exec(). Вам нужно либо создать свой QWebSocket внутри потока, либо использовать moveToThread().