Реализация задержки в программе

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Реализация задержки в программе

Сообщение dimix » 17.03.2005 (Чт) 13:16

Нашел такой пример:

Public Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)

Sleep 1000

Стоит им воспользоваться, или лучше как-дь по другому?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.03.2005 (Чт) 13:19

Да, можно.

Но вообще зависит от того, что именно ты хочешь получить. На практике вариантов довольно много.

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 18.03.2005 (Пт) 17:55

А у меня сработало только если вот так
Код: Выделить всё
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


А вообще я вот так делал еще

Код: Выделить всё
Public Sub Wait(seconds)
    Timer1.Enabled = True
    Me.Timer1.Interval = 1000 * seconds
    While Me.Timer1.Interval > 0
        DoEvents
    Wend
    Timer1.Enabled = False
End Sub


Private Sub Timer1_Timer()
    Timer1.Interval = 0
End Sub



Теперь где надо подождать пишу wait (время в сек)

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 18.03.2005 (Пт) 18:30

А Timer не будет сильнее загружать систему, по сравнению со Sleep?

А Public я тоже на Private заменил.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 18.03.2005 (Пт) 19:04

dimix писал(а):А Timer не будет сильнее загружать систему, по сравнению со Sleep?

Наоборот! Таймеры [edit@20:40 18.03.2005]не выполняются в отдельном потоке, но работают асинхронно - спасибо за информацию, alibek.[/edit]
Последний раз редактировалось hCORe 18.03.2005 (Пт) 20:41, всего редактировалось 1 раз.
Моду создают модоки, а распространяют модозвоны.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.03.2005 (Пт) 20:17

Насколько я знаю, таймеры НЕ выполняются в отдельном потоке. Просто Windows посылает соответствующее сообщение (WM_TIMER) в основной цикл программы, поэтому таймеры и выглядят асинхронными.
Lasciate ogni speranza, voi ch'entrate.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 19.03.2005 (Сб) 3:05

Если такие вот задержки внести в цикл, то под ХР его скорость не будет превышать 64 итеррации/сек
И как с этим справиться - никто не сказал.
Кстати говоря - этот способ был в одной одной книге предложен.
Там сказано: чтоб скорость главного цикла не варьировалась на разных компах, то замедляем так(проверяем перед очередной итеррацией, прошло ли заданное количество мкС)
Похоже, этот человек не знал об особенностях работы этого способа под ХР!

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 21.03.2005 (Пн) 14:04

Че-то вы меня совсем запутали. Не, вы не виноваты - виновата моя нехватка знаний. Короче, как лучше делать? Таймером?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.03.2005 (Пн) 14:29

Да как хочешь :)

Например: берёшь Waiter! из Кирпичей, создаёшь Event (CreateEvent), натравливаешь Waiter! на hEvent с заданным таймаутом. Поскольку никто ставить hEvent в сигнальное состояние не будет, то Waiter! сгенерит Complete ровно по окончании срока ожидания :)
Потом CloseHandle на hEvent не забываем :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 21.03.2005 (Пн) 14:34

GSerg, ты все прояснил! :D

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 21.03.2005 (Пн) 18:29

2GSerg А если я этот Waiter в цикл пихну? И под ХР?
Будет ОК, или как всегда?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.03.2005 (Пн) 18:49

Асинхронный контрол в цикл? Интересно, зачем и как? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 21.03.2005 (Пн) 20:46

2 GSerg тьфу, не знал я что такое этот ваш Waiter!
Короче, выражусь так: можно его использовать для внесения задержки в цикл, и будет ли сие правильно функционировать по Хр?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.03.2005 (Вт) 4:35

Сие будет правильно функционировать под XP (хотя я и не проверял :) ), но как ты будешь обрабатывать событие Complete и продолжать после него цикл? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 22.03.2005 (Вт) 4:51

Так как я не видел НИ этого контрола(или что там он из себя представляет), НИ примеров его использования, я и задал соответствующий вопрос:

Ariman писал(а):.....можно его использовать для внесения задержки в цикл, и будет ли сие правильно функционировать по Хр?


Поэтому ожидаю на него ответа, а не встречного вопроса(мол, можно, конечно, но как? :wink: )

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.03.2005 (Вт) 5:18

А ты посмотри контрол, посмотри :)

Для цикла он не годится совсем :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 23.03.2005 (Ср) 0:04

2 GSerg. "Обрабатывать событие Complete и продолжать после него цикл" - может я просто чего-то не понял, но в чем сложность обработать Complete и продолжить цикл? Я именно так и использую Waiter! - в цикле. Или ты о другом?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.03.2005 (Ср) 3:03

Ты внутри цикла.
Заставляешь waiter! ждать.
Ты не знаешь, когда будет complete.
Чем ты занимаешься в этом цикле, пока он ждёт? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 23.03.2005 (Ср) 13:16

Пока Waiter! ждет, я занимаюсь чем угодно :)

Рассказываю по порядку. У меня возникла необходимость запускать процессы в цикле поочередно, каждый новый - по завершению предыдущего. Завершение я стал ждать Waiter!'ом, а цикл организовал так:
1. Есть процедура, допустим Go(), запускающая процесс с использованием Waiter!'а. Она запускает только один процесс.
2. В Complete Waiter!'а я поместил ссылку на процедуру Go.
3. Есть переменная, которой я изначально присваиваю значение, равное требуемому количеству итераций цикла. В Complete, либо в самой процедуре Go уменьшаю значение переменной на 1.
Остается только где-то хранить список процессов, которые нужно запускать, а процедура Go в соответствии со значением переменной, возьмет из списка нужный процесс и запустит его.
Ну а запускается цикл понятно как - сформировали список процессов, в переменную записали количество итераций и один раз вызвали процедуру Go.
Конечно, это не For Next, но чем не цикл?
Соответственно, пока процессы работают а Waiter! ждет, можно заниматься чем угодно, благо Waiter! позволяет, за что ему и спасибо. Кстати, GSerg, скачай себе Waiter! - классная штука! :D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.03.2005 (Ср) 15:19

dimix писал(а):Кстати, GSerg, скачай себе Waiter! - классная штука! :D


Долго думал над твоим предложением :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 23.03.2005 (Ср) 16:31

Чем ты занимаешься в этом цикле, пока он ждёт?

Все тебе расскажи :lol:
Ктож такие интимные подробности разглашает???

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 23.03.2005 (Ср) 16:35

А вообще, надо и мне скачать, а то не знаю, кому из вас верить :?

Мне нужно только одно - у меня есть главный цикл, который исполняется, пока работает программа. И мне нужно, чтобы можно было регулировать веремя между его итеррацияи. Или не выполнять инструкции цикла, пока не проудет нужное мне время, т.е. просто пропускать все, что внутри него...
Так пойдет для этого ваш WAITЕR! или нет???

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.03.2005 (Ср) 16:47

Ariman, вкупе с CreateWaitableTimer - подойдёт.
Изображение

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 23.03.2005 (Ср) 18:17

GSerg писал(а):Долго думал над твоим предложением :)


:lol: Ну и как, надумал?

2 Ariman. Давно бы уже скачал. Если сейчас не понадобится - может потом пригодится. (GSerg, мне проценты полагаются?)

Ariman писал(а):Ктож такие интимные подробности разглашает???


Ariman, а может предложим GSerg'у встроить в Waiter! инструкцию в виде рекомендаций "Чем вы можете заняться, пока Waiter! ждет"? И статистику собирать. И топ-лист вывесить. :)

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 23.03.2005 (Ср) 23:21

dimix писал(а):2 Ariman. Давно бы уже скачал. Если сейчас не понадобится - может потом пригодится.

Не имею сейчас возможности проверять новые методы. Чуть-чуть разгружусь, обязательно скачаю и попробую.

dimix писал(а):Ariman, а может предложим GSerg'у встроить в Waiter! инструкцию в виде рекомендаций "Чем вы можете заняться, пока Waiter! ждет"? И статистику собирать. И топ-лист вывесить. :)

Здравая мысль!!! :lol: А еще лучше на форуме тему создать! С опросом!(Или без опроса, пусть сами предлагают!) :lol:

2tyomitch Если не трудно, кинь примерчик, пожалуйста...

А под ХР скорость цикла не падает? До 64 итерраций??? Мне же это главное.......


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 136

    TopList