Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Jin X
Евгений, Самара
1267 / 521 / 109
Регистрация: 14.12.2014
Сообщений: 1,430
Завершенные тесты: 2
#1

Sleep - что внутри? - Delphi WinAPI

17.09.2016, 19:54. Просмотров 505. Ответов 3
Метки нет (Все метки)

Цикл
Delphi
1
2
3
repeat
  Sleep(1)
until ...
почти не грузит процессор.
Что там такого зашито внутри? Как это можно реализовать кроме как через Sleep?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2016, 19:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Sleep - что внутри? (Delphi WinAPI):

Sleep(1000): Как сделать паузу и в тоже время иметь контроль над формой? - Delphi
Как в Delphi сделать паузу и в тоже время иметь контроль над программой? Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000...

Sleep внутри мьютекса - C++
Может ли это как-то вешать программу, если да то почему?

Sleep внутри функции - перекрывает выполнение предыдущих строк - C++ Builder
Привет! Набрел на проблему, никак не могу решить в теле функции имеется: { ... Label1->Caption = "что то там..."; ...

Sleep(8000) - что значит? На что можно заменить в борланд с++? - C++
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как исправить? ...

Что можно использовать вместо Sleep? - C++ Builder
Ребята подскажите, что можно использовать вместо Sleep(10000)(10 сек), но при ней форма зависает Application->ProcessMessages();...

Thread.Sleep() или Timer. Что лучше использовать? - C#
Здраствуйте уважаемые знатоки. Мне нужно опрашивать определенный метод с переодичностью 30 сек. Что лучше использовать чтобы нагрузка...

3
Jin X
Евгений, Самара
1267 / 521 / 109
Регистрация: 14.12.2014
Сообщений: 1,430
Завершенные тесты: 2
19.09.2016, 12:55  [ТС] #2
Собственно, суть вопроса в том, что я хочу сделать цикл spin-loop, разбавленный (после некоторого безуспешного кол-ва циклов) чем-то, разгружающим процессор, но не слишком долгим. Sleep, честно говоря, мне не очень нравится. Чем его можно заменить?

Добавлено через 1 минуту
К сожалению, pause не разгружает проц вообще никак
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.09.2016, 13:08 #3
Можно сделать так: сначала идет несколько "полноценных" spin-циклов,
далее несколько циклов с pause, потом уже Sleep со все возрастающей
(до некоторого значения) задержкой.
0
Jin X
Евгений, Самара
1267 / 521 / 109
Регистрация: 14.12.2014
Сообщений: 1,430
Завершенные тесты: 2
19.09.2016, 20:28  [ТС] #4
Я всё же сделаю так: несколько (1024, скорее всего) полноценных циклов с pause (Intel рекомендует), затем Sleep(1) и всё заново.
И на i5 2500K, и на нетбуке со слабым процем (Atom) такой код с 256 такими потоками грузит проц меньше, чем на 1% (примерно такая же история с 1024 потоками при кол-ве циклов 256)

Добавлено через 56 минут
Даже так: X (скажем, 256) полноценных циклов с pause, затем SwitchToThread. Всё это повторяем Y раз (скажем, 4), затем заменяем SwitchToThread на Sleep(1). И всё заново.
Получается один Sleep(1) на 1024 циклов, но до него ещё 3 SwitchToThread.

SwitchToThread нужны для принудительного переключения потоков, который происходит автоматически довольно редко (раз в 10-15 мс). Т.е. иначе получается, что пока мы ждём 1024 цикла до Sleep(1) на том же ядре всё равно будет работать только этот поток и надеяться нужно либо на автоматическое переключение потоков Windows'ом, либо на то, что другие потоки работают на другом ядре, что не совсем разумно... Слишком частый вызов SwitchToThread делать тоже не стоит, т.к. он тоже грузит процессор.

Добавлено через 3 часа 49 минут
upd:
( ( 265 spin-циклов, затем SwitchToThread ) * 4 раза, затем Sleep(1) ) * 4 раза.
Итого выходит 4096 циклов. Не так много, но и не мало.
После этого переходим на Sleep(1) после каждой проверки, максимально разгружая таким образом проц.
Подобрать только более оптимально цифры надо: 256, 4, 4...
0
19.09.2016, 20:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 20:28
Привет! Вот еще темы с ответами:

System.Threading.Thread.Sleep считает неправильно, что сделать? - C#
на кнопке такой код: private void button3_Click(object sender, EventArgs e) { DateTime curdata =...

Что есть что в задании? (что есть скрипт, а что - запрос, внутри) - SQL Server
"Создать модель сущность-связь. Написать скрипт создания таблицы в соответствии с этой моделью. Написать SQL запрос к созданной вами...

Что означает каждая строчка в "Sleep time.bat"? - CMD/BAT
:help: @echo off set /a ttt=%1 * 100 set tim=%time% for /f "tokens=1,2,3 delims=:" %%a in ("%tim%") do set /a...

Что это внутри БП - Блоки питания
Доброго времени. Компьютер перестал включатся и я разобрал БП и обнаружил внутри желтоватое вещество как застывшая жевательная резинка, что...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru