Как правильно сделать поток (QThread) в случае получения информации из «буфера»?
Приветствую!
Есть сторонняя библиотека, в ней есть некоторый "буфер" (обычный массив на 10000 элементов) в который она заносит данные, но делает она это не равномерно, т.е. может через 100мс внести 10 элементов, а может через 10мс внести 100элементов.
Мне нужно соответственно читать эти данные по мере их появления, и что бы не подвешивать GUI я создаю новый поток
QThread, а в нём бесконечный цикл while(true) { ... } в котором проверяю, есть ли новые данные и, если есть, обрабатываю их.
Проблема в том, что из-за этого потока, в котором бесконечный цикл, ядро загружается на 100%, при этом большую часть времени цикл гоняется в холостую, так как данные обрабатываются достаточно быстро, а новые ещё не подоспели.
Когда один такой поток ещё жить можно, а вот когда 10, то все ядра загружены под 100% и по сути ничего не делают... А если ядер в процессоре будет меньше, то лагать начнёт всё это дело жутко.
Как сделать наиболее правильно, что бы и загрузки ядер такой не было и что бы данные обрабатывались сразу, как только появились?
А может быть есть какие-либо динамические способы или практики расчёта интервала?
Просто не представляю как мне всё учесть - ведь производительность ПК у разных пользователей разная, функции выполняются не за константное время и т.д...
Игорь Джулай, это я понимаю, но если я поставлю интервал, например, 30мс - будут лишние задержки между поступлением данных и их обработкой и может случится так, что буфер просто напросто переполнится (данные пришли, мы прождали 30мс, обработали, за это время ещё пришли, а мы ведь ждёт до следующей обработки ещё 30мс, опять обработали и т.д.).
Pavel K, задержка будет максимум 30 мс, но думаю даже если 1 мс задержку поставить то процессор грузить не будет. Может и в самой библиотеке есть задержки а вы тут гонитесь за миллисекундами.
Как вариант - создать свой класс для приёма данных, внутри него объект QThread* thd, в конструкторе своего класса - moveToThread(thd), в том же классе - таймер, выставленный на минимально нужное время и приконнекченный к слоту, где проверяется буфер. Хотя при интервале 10мс лагов уже не должно быть.