Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
_Ronin_
Зарегистрирован: 02.04.2006 Сообщения: 2
|
Добавлено: Вс Апр 02 2006 07:44 Заголовок сообщения: Пауза через API? |
|
|
Народ, кто-нибудь знает как сделать паузу на определенное количество миллисекунд через API - функцию? Подскажите, плз. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Вс Апр 02 2006 08:22 Заголовок сообщения: |
|
|
ОС?
ЯП? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
_Ronin_
Зарегистрирован: 02.04.2006 Сообщения: 2
|
Добавлено: Вс Апр 02 2006 21:23 Заголовок сообщения: |
|
|
Windows. Язык программирования без разницы какой. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пн Апр 03 2006 18:53 Заголовок сообщения: |
|
|
А че именно API? Ладно, посмотрю че-нибудь... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Вт Апр 04 2006 13:16 Заголовок сообщения: |
|
|
В API есть функция Sleep, точного синтаксиса не скажу, но она должна быть, а вообще в Си тоже есть функция sleep. Да, будьте готовы что работает она по сигналам таймера, то есть нельзя сделать паузу на 1 миллисекунду, паузы будут кратными периоду таймера около 1/18 секунды. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Malcolm
Зарегистрирован: 12.06.2004 Сообщения: 187 Откуда: Хабаровск
|
Добавлено: Ср Апр 05 2006 20:56 Заголовок сообщения: |
|
|
Импорт в делфи
Цитата: | procedure Sleep; external kernel32 name 'Sleep'; stdcall; |
Цитата: | Да, будьте готовы что работает она по сигналам таймера, то есть нельзя сделать паузу на 1 миллисекунду, паузы будут кратными периоду таймера около 1/18 секунды. |
Неправда.
проверьте сами
Цитата: |
time := timegettime;
sleep(238);
time := timegettime - time;
label1.Caption := inttostr(time);
|
в итоге в 99% случаев получаем 238 или 239 при незагружености системы. в других случаях нечто большее. Делаем вывод что функция sleep вызывает остановку нити не менее чем на указанное число миллисекунд. Обо всем остальном, в т.ч. и о том когда же нить действительно возобновится, заботится вытесняющая многозадачность. _________________ АсЬки ТуТ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Чт Апр 06 2006 07:28 Заголовок сообщения: |
|
|
А вы думаете указанные значения не кратны 1/18? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Malcolm
Зарегистрирован: 12.06.2004 Сообщения: 187 Откуда: Хабаровск
|
Добавлено: Пт Апр 07 2006 18:02 Заголовок сообщения: |
|
|
Не думаю а знаю, опять же посчитайте сами.
0,239 / ( 1/18 ) = 18 * 0,239 = 4,302
совсем некратно. Но это только во первых.
Во вторых, еслиб все было так как вы говорите, то столь стабильные результаты времени мы бы не получали т.к. конкретный код может выполняется не одновременно с тиком, а может быть посередине между тиками или ближе к следующему тику. В итоге задержка была бы ( 1/18 )*k + x, где k - целое, а x<1/18, и x это время с момента вызова sleep() до следующего тика, на практике же ничего подобного не наблюдается.
и в третьих. Допустим вы правы, тогда почему же в Windows SDK и в MSDNоб этом абсолютно ничего не сказано, напротив утверждается что Sleep() вызывает задержку нити как минимум на указанное число миллисекунд?
Взвесив все за и ни одного против делаем вывод что никакие тики таймера на работу этой функции не влияют. Возможно подобное поведение имело место в более ранних версиях виндовс, но это утверждать не берусь. _________________ АсЬки ТуТ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Сб Апр 08 2006 21:10 Заголовок сообщения: |
|
|
Ну обещание что пауза будет не меньше справедливо. А насчет таймера, так ведь по нему происходит переключение процессов. Правда его можно перепрограммировать, но, насколько мне известно, в микрософте этим не занимались... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Malcolm
Зарегистрирован: 12.06.2004 Сообщения: 187 Откуда: Хабаровск
|
Добавлено: Вс Апр 09 2006 15:05 Заголовок сообщения: |
|
|
Мы когда-нибудь начнем верить фактам? То что переключение процессов происходит по таймеру совершенно никак не мешает функции sleep сделать задержку в точное число миллисекунд. Более того windows xp может переключать процессы быстрее чем 18 раз в секунду, например раз в 10мс, и даже может быть такое что работа одного процесса прерывается всего на 1мс, для, например, обработки сообщения другим процессом. не верите - проверьте. _________________ АсЬки ТуТ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
NewFork
Зарегистрирован: 28.02.2005 Сообщения: 73
|
Добавлено: Вт Май 16 2006 08:02 Заголовок сообщения: Re: Пауза через API? |
|
|
_Ronin_ писал(а): | Народ, кто-нибудь знает как сделать паузу на определенное количество миллисекунд через API - функцию? Подскажите, плз. |
Есть фишка когда через АПИ можно вызывать в 100% нужное время функцию, посмотрю ее реализацию на днях и напишу.
Ну а дальше, не знаю, можно ее например зарядить на запуск каждую милисекунду пока не пройдет нужное время, и потом остановить... Была где-то реализация такой фигни... помоему в примерах АПИ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Malcolm
Зарегистрирован: 12.06.2004 Сообщения: 187 Откуда: Хабаровск
|
Добавлено: Пт Май 19 2006 19:44 Заголовок сообщения: |
|
|
Цитата: | Есть фишка когда через АПИ можно вызывать в 100% нужное время функцию, |
имхо невозможно _________________ АсЬки ТуТ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|