Высоко приоритетный поток, как сделать? |
Здравствуйте, гость ( Вход | Регистрация )
Высоко приоритетный поток, как сделать? |
MishaUA |
30.9.2017, 20:11
Сообщение
#1
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Недавно создавал тему, в которой писал о подключении матричного индикатора.
Суть в том, что отрисовка должна происходить очень быстро, я ещё сделал в отдельном потоке (QThread в run), задержка там только одна на 50мкс, т.е., процесс потребляет довольно много процессорного времени, а конкретно - ~86% (проц 4 ядерный), это при QApplication, а с QCoreApplication было почему-то 100%, хоть в теории, QApplication потребляет больше ресурсов. Отрисовка изначально происходит нормально, но периодически (раз в пару мин) экран начинает мерцать, при этом нагрузка на том ядре падает примерно до 40% и через 2-5 сек мерцать перестает и до >80% нагружается совершенно другое ядро. Походу, процесс каким-то образом перепрыгнул на другое ядро. процесс запускаю как QThread::HighestPriority, а саму прогу с опцией nice --20 (хоть реально большой приоритет нужен не всей программе, а только одному процессу). Так же, мерцать всегда начинает когда захожу по ssh и логинюсь. Можно ли как-то сделать этот процесс со "сверхвысоким" приоритетом? Спасибо! |
|
|
Iron Bug |
30.9.2017, 21:43
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
есть сильное ощущение, что ты там что-то принципиально не то делаешь. как ты умудрился выводом в матрицу загрузить 4 ядра проца на 1.6GHz? и чем выше приоритет твоего жручего процесса - тем больше будет тормозить графика, ясное дело. все жручие вычисления всегда делают в бэкграунде.
|
|
|
MishaUA |
30.9.2017, 22:22
Сообщение
#3
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Так я и не говорил, что грузит все ядра, грузит только одно ядро, остальные почти не нагружены
|
|
|
Iron Bug |
1.10.2017, 17:45
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
да даже одно ядро такой задачей загрузить - это надо как-то извратиться сильно.
|
|
|
MishaUA |
2.10.2017, 10:07
Сообщение
#5
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
При том, что в потоке постоянно крутится цикл с единственной задержкой в 50 микросекунд, это вполне нормально
|
|
|
Iron Bug |
2.10.2017, 20:35
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
нет, постоянно крутящийся цикл с задержкой в 50 us - это ненормально. тем более, что не всякий таймер строго даёт те 50 us. и тем более, что с такой скоростью что-то перерисовывать однозначно не нужно: развёртка экрана реже в 400 раз делается.
|
|
|
MishaUA |
4.10.2017, 15:58
Сообщение
#7
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Вся матрица разделена на 16 частей и включенной может быть только одна с его частей, для нормального отражения надо поочередно отображать эти части с большой скоростью, вот интервал между отражениями - 50мкс. Условно говоря, экран обновляется подлостью 1000/(0,5*16)=125 раз в секунду.
|
|
|
Iron Bug |
4.10.2017, 21:08
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Вся матрица разделена на 16 частей и включенной может быть только одна с его частей, для нормального отражения надо поочередно отображать эти части с большой скоростью, вот интервал между отражениями - 50мкс. Условно говоря, экран обновляется подлостью 1000/(0,5*16)=125 раз в секунду. а зачем? частота развёртки - от 60-85 Гц. а человек воспринимает не более 24 кадров в секунду. ты пытаешься "обновлять" экран в два раз быстрее, чем он перерисовывается физически. естественно, что он не обновляется. |
|
|
MishaUA |
5.10.2017, 11:31
Сообщение
#9
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
даже при задержке 100, и 200 мкс матрица периодически начинает мерцать. Тут очень важно чтобы интервалы обновления были ровными. Если какой-то ряд пикселей горит дольше, то получается сильно заметное мерцание.
|
|
|
Алексей1153 |
6.10.2017, 9:12
Сообщение
#10
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
MishaUA, можно даже с обновлением раз в секунду сделать без мерцания. Раз в секунду загружаешь кадр в железяку, а железяка всю эту секунду с любой любимой частотой рисует предыдущий кадр. И компу не напряжно, и железяка довольна.
всё дело в подходе Сообщение отредактировал Алексей1153 - 6.10.2017, 9:13 |
|
|
Текстовая версия | Сейчас: 24.11.2024, 8:07 |