Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2016, 19:55   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию Sleep - что внутри?

Бесконечный цикл со Sleep(1) почти не грузит процессор.
Что там такого зашито внутри? Как это можно реализовать кроме как через Sleep?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 17.09.2016, 20:10   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Sleep(1) не сильно отличается от Sleep(50), точнее все что меньше системного таймера.
он ставит поток в спящее состояние, и планировщик потоков просто не дает ему кванта времени.
это все на уровне ядра, вам там обычно делать нечего.

насчет как реализовать, ничего не делать, спать))
зависит от того что вам нужно?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.09.2016, 22:39   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А вам зачем?
Можно и самому

CreateEvent
WaitForSingleObject - с нужным тайм аутом
SendMessage - посылаем сообщение о таймере в очередь сообщений.

В виндоусе нет понятия спящего процесса как в линуксе. В место этого используется система приоритетов. Помимо основного круга есть ещё и служебный. Служебный круг как раз и нужен для обработки событий и очередей. Служебный круг вызывается не часто, делается это с частотой системного таймера. WaitForSingleObject проверяет тайм аут и если его нет отдаёт управление ОС. Отдача происходит скорее всего через ThreadSwitch()
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 17.09.2016, 22:50   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
В виндоусе нет понятия спящего процесса как в линуксе.
ага, чтож тогда поток делает когда находится в Sleep/GetMessage/etc?
Цитата:
Служебный круг как раз и нужен для обработки событий и очередей.
вы о чем?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.09.2016, 23:29   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
ага, чтож тогда поток делает когда находится в Sleep/GetMessage/etc?
Очень медленно моргает.
Цитата:
вы о чем?
О том что события в линуксе проверяет ядро или другие компоненты ОС.
А в виндоусе сам поток проверяет событие.
Поэтому в виндоусе потоки не спят, они редко вызываются. А в линуксе спят, до тех пор пока не разбудят.

Возможно принципиальной разницы в этом и нет. Просто хотел подчеркнуть, что работают малость по разному.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 17.09.2016, 23:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
О том что события в линуксе проверяет ядро или другие компоненты ОС.
А в виндоусе сам поток проверяет событие.
GetMessage - Ядро, разбуди меня когда придет сообщение.
PeekMessage - Ядро, а есть ли сообщения ко мне?

где тут что сам поток проверяет события?
Цитата:
Поэтому в виндоусе потоки не спят, они редко вызываются. А в линуксе спят, до тех пор пока не разбудят.
спят они вполне, поток не выйдет из ядра пока не придет время.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2016, 12:25   #7
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
насчет как реализовать, ничего не делать, спать))
зависит от того что вам нужно?
Я хочу выполнять некий циклический процесс (spin-loop, в частности) таким образом, чтобы не грузить процессор. Можно после каждого цикла вызывать Sleep(1), но мне это кажется не самым оптимальный вариантом...
EnterCriticalSection, как я понимаю, после определённого кол-ва циклов создаёт объект ядра и переходит в режим ожидания. Что именно он делает и вообще, оптимально ли это?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 18.09.2016 в 12:32.
7in вне форума Ответить с цитированием
Старый 18.09.2016, 12:39   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
(spin-loop, в частности)
активное ожидание всегда грузит.
Цитата:
Что именно он делает и вообще, оптимально ли это?
по сути создает просто ивент.
CreateEvent, это оптимально для ожидания.

Критсекция все же для защиты ресурса, а не для ожидания.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2016, 12:48   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Sleep(1) не сильно отличается от Sleep(50)
Отличается, но и не 1 мкс. Например таким кодом отследить. Каждый раз по разному, от 0,1 секунды с копейками по почти секунды. В среднем ~ 0.5 сек. А 50 почти точно 5 секунд. Везде в основном пишут, что минимум 10 мкс. Что-то не сходится
Код:
  c:=GetTickCount;
  for i:=1 to 100 do Sleep(1); // или 50
  Edit1.Text:=IntToStr(GetTickCount-C);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.09.2016 в 12:53.
Аватар вне форума Ответить с цитированием
Старый 18.09.2016, 14:05   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
А в виндоусе сам поток проверяет событие.
Кто вам такой бред сказал?
waleri на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как доказать, что точка лежит внутри многоугольника? NikiToZz_ Паскаль, Turbo Pascal, PascalABC.NET 7 19.06.2016 12:16
Показывается, что часть диска занята, а внутри - Эта папка пуста keen_ Операционные системы общие вопросы 11 15.10.2012 11:54
Обработка одномерных массивов, СИ. задание внутри, и написанный мною текст программы тоже внутри. кое-что нужно исправить.. Амелия Общие вопросы C/C++ 6 02.04.2012 20:03
moc_mainwindow, а что внутри? Farrel Qt и кроссплатформенное программирование С/С++ 3 09.06.2011 16:03
код проги внутри, что там не так??? Gula1706 Общие вопросы C/C++ 1 18.12.2010 00:27