Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
CPU дросселирование в C++
Мне просто интересно, есть ли элегантный способ установить максимальную нагрузку CPU для конкретного потока, выполняющего интенсивные вычисления.
Прямо сейчас я нашел самый трудоемкий цикл в потоке (он делает только сжатие) и использую GetTickCount() и Sleep() с жестко заданными значениями. Это гарантирует, что цикл продолжается в течение определенного периода времени, а затем спит в течение определенного минимального времени. Он более или менее выполняет свою работу, т. е. гарантирует, что поток не будет использовать более 50% из CPU.
Однако поведение зависит от количества ядер CPU (огромный недостаток) и просто уродливо (меньший недостаток :)).
Есть идеи?
Я не знаю ни одного API, чтобы заставить планировщик OS делать то, что вы хотите (даже если ваш поток имеет приоритет ожидания, если нет готовых потоков с более высоким приоритетом, Ваш будет работать). Однако я думаю, что вы можете импровизировать довольно элегантную функцию регулирования, основанную на том, что вы уже делаете. По существу (у меня нет машины Windows dev под рукой):
Выберите количество времени по умолчанию, в течение которого поток будет спать каждую итерацию. Затем на каждой итерации (или на каждой N-й итерации, так что функция регулирования сама по себе не становится значительной нагрузкой CPU),
- Вычислите количество CPU времени, которое ваш поток использовал с момента последнего вызова функции регулирования (я буду называть это dCPU). Вы можете использовать GetThreadTimes() API, чтобы получить количество времени выполнения вашего потока.
- Вычислите количество реального времени, прошедшего с момента последнего вызова вашей функции регулирования (я буду называть это dClock).
- dCPU / dClock - это процент использования CPU (одного CPU). Если он выше, чем вы хотите, увеличьте время сна, если ниже, уменьшите время сна.
- Пусть ваш поток спит в течение вычисленного времени.
В зависимости от того, как ваш сторожевой пес вычисляет использование CPU, вы можете использовать GetProcessAffinityMask() , чтобы узнать, сколько CPUs имеет система. dCPU / (dClock * CPUs) - это процент от общего количества доступного времени CPU.
Вам все равно придется выбрать некоторые магические числа для начального времени сна и количества инкрементов/декрементов, но я думаю, что этот алгоритм можно настроить так, чтобы поток работал на довольно близком к определенному проценту CPU.
Я не могу придумать никакого кросс-платформенного способа того, что вы хотите (или любой гарантированный способ полной остановки), но поскольку вы используете GetTickCount, возможно, вы не заинтересованы в кросс-платформенном способе :)
Я бы использовал межпроцессные коммуникации и установил интенсивные процессы на хороших уровнях, чтобы получить то, что вам нужно, но я не уверен, что это подходит для вашей ситуации.
EDIT: Я согласен с Бернардом , вот почему я думаю, что процесс, а не нить может быть более подходящим, но это просто не подходит для ваших целей.
Проблема в том, что это ненормально-оставлять CPU в бездействии, пока у вас есть работа. Обычно вы устанавливаете фоновую задачу на приоритет IDLE и позволяете OS управлять ее планированием все время CPU, которое не используется интерактивными задачами.
Мне кажется, что проблема заключается в сторожевом процессе.
Если ваша фоновая задача привязана к CPU, то вы хотите, чтобы она заняла все неиспользованное CPU время для своей задачи.
Может быть, вам стоит посмотреть на исправление сторожевой программы?
Вы можете изменить приоритет потока, но изменение максимального использования потребует либо опроса и взломов, чтобы ограничить количество происходящих событий, либо использования инструментов OS, которые могут установить максимальное использование процесса. Однако я не вижу никаких обстоятельств, при которых вы хотели бы это сделать.