Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Jin X
Евгений, Самара
748 / 379 / 87
Регистрация: 14.12.2014
Сообщений: 1,003
#1

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

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

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

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

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

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

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

Что означает каждая строчка в "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...

Что внутри, Builder? - C++ Builder
STL, MFC, VCL, RTTI, CRT, BOOST, LOKI что это, где это, из чего состоит Borland Builder C++ 6

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

Добавлено через 1 минуту
К сожалению, pause не разгружает проц вообще никак
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
19.09.2016, 13:08     Sleep - что внутри? #3
Можно сделать так: сначала идет несколько "полноценных" spin-циклов,
далее несколько циклов с pause, потом уже Sleep со все возрастающей
(до некоторого значения) задержкой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 20:28     Sleep - что внутри?
Еще ссылки по теме:

Объясните то, что на скриншоте внутри - Процессоры
посмотрите на картинку.......

Что за железо стоит внутри? - Компьютерное железо
_QFImVTB2T4 Добавил ссылку на Youtube на всякий случай.http://youtu.be/_QFImVTB2T4 Здравствуйте, наткнулся на вот такую интересную...

Что это за ошибка? (скриншоты внутри). - Видеокарты
Скажыте мне пожалуста чо ет за ошибки и как от них избавиться. ОШИБКА №1 Ета ошибка выскакивает кода я пользуюсь флешкой через...

Что это такое? (фото внутри) - Компьютерное железо
Что это такое???

Вырезать всё, что внутри url() - PHP
Добрый день ув. пользователи! Подскажите пожалуйста, как достать только то, что внутри url() ? url(/uploads/image/tmb.png)

Что за цифры внутри jpeg-файла? - Python
Доброго времени суток....тренировался читать файлы, jpeg..... file =...


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

Или воспользуйтесь поиском по форуму:
Jin X
Евгений, Самара
748 / 379 / 87
Регистрация: 14.12.2014
Сообщений: 1,003
19.09.2016, 20:28  [ТС]     Sleep - что внутри? #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...
Yandex
Объявления
19.09.2016, 20:28     Sleep - что внутри?
Ответ Создать тему
Опции темы

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