1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 131
1

Точность цикла потока и загруженность процессора

21.02.2024, 09:30. Показов 551. Ответов 5

Author24 — интернет-сервис помощи студентам
Создаю поток со стабилизацией времени цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int64_t CycleNS = 100000;
    
    while (ExitT == false)
    {
        StartTim = std::chrono::steady_clock::now();
 
        // .....;
 
 
        boost::this_thread::sleep_for(boost::chrono::microseconds(
                                          CycleNS - Duration(std::chrono::steady_clock::now() - StartTim).count()));
//        while (CycleNS - Duration(std::chrono::steady_clock::now() - StartTim).count() > 0 ){}
    }
В данной ситуации стабилизация цикла плохая, время цикла «прыгает» 100-110, иногда и 120 мс, но при этом загруженность процессора низкая ~0%. Если стабилизацию сделать на while, то будет наоборот, стабилизация очень хорошая и загрузка процессора >30%. Есть возможность совместить хорошую стабилизацию цикла и низкую загрузку процессора?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2024, 09:30
Ответы с готовыми решениями:

Как только захожу в игру, загруженность процессора упирается в 100%, спустя минут 5 загруженность падает до 10-30%
Захожу я значит поиграть в Овервотч, но при заходе в игру первые 5 минут у меня загруженность...

Загруженность процессора 50%
Доброго времени суток! Сегодня появилась такая проблема - svchost.exe грузит процессор на 50%....

Загруженность процессора?
Уже нашёл ответ на Си. Помогите, пожалуйста, с "переводом" на Visual Basic. Ну а в идеале можно...

Загруженность процессора
Доброго вечера всем! Есть ли в php что нибудь для определения текущей загрузки процессора...

5
204 / 139 / 23
Регистрация: 26.11.2022
Сообщений: 625
21.02.2024, 10:09 2
у вас ОС реального времени? скорее всего нет. так что вы можете добиться чего-то подходящего на вашем конкретном компьютере/ОС но на других компах/ОС будет другая ситуация.
ещё неизвестно как поведёт ваш цикл когда комп будет выполнять ещё какую-нибудь программу помимо вашей.

ну и неплохо былобы написать зачем такое надо - особенно на какую стабильность вы расчитываете
0
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 131
21.02.2024, 10:33  [ТС] 3
ОС-ы обычные Windows (разработка, тестирование...), Linux встроенная, штатная работа. Поток будет работать на отдельном ядре и общаться с аппаратурой.
0
204 / 139 / 23
Регистрация: 26.11.2022
Сообщений: 625
21.02.2024, 11:53 4
Вот из-за того что на обычной ОС нельзя добиться стабильных задержек приходится делать дополнительные контроллеры - которые получают от компа некоторый минимальный объём информации чтобы они могли проработать пару секунд сами без участия компьютера, поскольку комп не сможет быстро отреагировать и выдать упавляющий сигнал.

Раз уш вы не хотите рассказывать что за аппаратура, какие требования по задержкам - период, джиттер и пр. Критичность задержек, как выдаётся управляющий сигнал - есть ли промежуточный драйвер который может решить что надо подсобрать данные и попозже отправить из пакетом и куча другой инфы. То ответы тоже будут очень пространными и обобщёнными.

Не забывает также что разрабатываете вы на современном компе - с хорошим быстродействием, а работать софт будет на самом слабом железе )))
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
17.04.2024, 01:59 5
Знаю, что тема немного старая, но я бы посоветовал вместо sleep_for использовать sleep_until с расчётом времени "просыпания" от начала первой итерации.

Момент следующего срабатывания при этом можно получить примерно так: next_activation = start + ((now() - start) / period + 1) * period.

Использование sleep_until вместо sleep_for позволит не спать дольше в случае, если поток может быть вытеснен ОС и он будет вытеснен после вычисления таймаута для sleep_for, но до самого sleepа.

Расчёт следующей активации от начала первого цикла нивелирует дрифт в периоде, если это важно.

Так же, если решите использовать sleep_until, то стоит посмотреть реализацию. Не знаю на счёт boost, но реализация из libstdc++, например, может использовать системное время для steady_clock.

Если можно использовать непереносимое API, то в Linux есть clock_nanosleep c CLOCK_MONOTONIC и TIMER_ABSTIME, или таймеры timerfd.
1
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 131
17.04.2024, 08:40  [ТС] 6
Спасибо, протестирую Ваши варианты.
0
17.04.2024, 08:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2024, 08:40
Помогаю со студенческими работами здесь

Влияет ли ОС на загруженность процессора?
Влияет ли ОС на процессор(то есть если я установлю вместо WIndows 7 Windows Xp, нагрузка на проц...

Windows 7 Загруженность процессора
ставил как x86 так и x64 постоянно не с того ни с сего грузится проц, сборка 7600 рус,...

Повышенная загруженность процессора
Здравствуйте. Возникла проблема на ноутбуке Acer Nitro 5 - в отсутствие работы каких-либо...

Не понятная загруженность процессора.!
Всем здравствуйте. Несколько дней назад возникла такая странность: Постоянно системный процесс NT...

Загруженность процессора на 100%
Вообщем проблема у меня такая... винда 7 64 бит. всё работает отлично НО когда я запускаю игру...

Узнать загруженность/занятость процессора
Гуру, дайте совет, пли-и-из! Надо сделать анимацию которая не затормозит если процессор на 99%!...

Как узнать загруженность процессора?
Можно ли стандартными средствами Java узнать на сколько процентов загружен процессор(процессоры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru