Задать вопрос
PavelK
@PavelK

Как правильно сделать поток (QThread) в случае получения информации из «буфера»?

Приветствую!
Есть сторонняя библиотека, в ней есть некоторый "буфер" (обычный массив на 10000 элементов) в который она заносит данные, но делает она это не равномерно, т.е. может через 100мс внести 10 элементов, а может через 10мс внести 100элементов.
Мне нужно соответственно читать эти данные по мере их появления, и что бы не подвешивать GUI я создаю новый поток
QThread, а в нём бесконечный цикл while(true) { ... } в котором проверяю, есть ли новые данные и, если есть, обрабатываю их.
Проблема в том, что из-за этого потока, в котором бесконечный цикл, ядро загружается на 100%, при этом большую часть времени цикл гоняется в холостую, так как данные обрабатываются достаточно быстро, а новые ещё не подоспели.
Когда один такой поток ещё жить можно, а вот когда 10, то все ядра загружены под 100% и по сути ничего не делают... А если ядер в процессоре будет меньше, то лагать начнёт всё это дело жутко.
Как сделать наиболее правильно, что бы и загрузки ядер такой не было и что бы данные обрабатывались сразу, как только появились?
  • Вопрос задан
  • 176 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
IGHOR
@IGHOR Куратор тега Qt
Qt/C++ DEV/CTO
Без интервала никак. Тут либо таймер вместо цикла, либо воткните QThread::msleep(100); перед окончаниям прохода цикла.
Ответ написан
@ForWinder
Как вариант - создать свой класс для приёма данных, внутри него объект QThread* thd, в конструкторе своего класса - moveToThread(thd), в том же классе - таймер, выставленный на минимально нужное время и приконнекченный к слоту, где проверяется буфер. Хотя при интервале 10мс лагов уже не должно быть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы