Задерка по времени

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

Задерка по времени

Сообщение 13GHOST » 06.06.2009 (Сб) 20:33

Вот возник вроде на первый взгляд легкий вопрос, но при реализации натолкнулся на проблему. Можно ли на VB6 организовать задержку между строками кода на определенное время? Вот такой структуры:
Код: Выделить всё
код
код
задержка
код
код

Пробывал вставить структуру: for - doevents - next, но тогда программа как бы зависает и другие процессы приостанавливаются :(
т е надо как бы получается завести таймер, который будет работать в паралельном режиме и по его срабатыванию перейти на след строку кода.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Задерка по времени

Сообщение Debugger » 06.06.2009 (Сб) 20:45

При DoEvents программа зависать не должна. Покажи код.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Задерка по времени

Сообщение arthur2 » 06.06.2009 (Сб) 20:50

Я бы сделал как-то так:
Код: Выделить всё
function myFun (optional flag as boolean=true)
  if flag then
    'код, код, код перед задержкой
     mytimer.interval=300
     mytimer.enabled=true
else
   'код, код, код после задержки
end if
end fuction

sub mytimer_timer ()
  mytimer.enabled=false
  myFun false
end sub
Последний раз редактировалось arthur2 06.06.2009 (Сб) 22:02, всего редактировалось 1 раз.
Артур
 
   

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Задерка по времени

Сообщение dr.MIG » 06.06.2009 (Сб) 21:05

А чем Sleep не устраивает?
И для чего вообще нужна пауза, может это можно решить другим путем?
Salus populi suprema lex

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Re: Задерка по времени

Сообщение 13GHOST » 06.06.2009 (Сб) 21:34

Debugger писал(а):При DoEvents программа зависать не должна. Покажи код.

она как бы не зависает, но какие то паралельные процессы (например другие окна там и т.д.) замирают
Код: Выделить всё
Sub TimeOut(Duration)
Dim StartTime As Long
StartTime = Timer
Do While Timer - StartTime < Duration
    DoEvents
Loop
End Sub


пример с таймером не совсем гибок. А если мне после задержки нужны переменные локольно объявленные до задержки? Придется их куда то сохранять, а если количество переменных до задержки равно N то гемора еще больше.

при Sleep'e вообще все напрочь зависает

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Задерка по времени

Сообщение Хакер » 06.06.2009 (Сб) 21:52

Ничего не зависает. Надо вообще-то понимать суть вещей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Задерка по времени

Сообщение awl100Alex » 06.06.2009 (Сб) 21:54

13GHOST
Циклы подобного плана вызывают 100% загрузку процессора даже вместе с DoEvents. :( Да и к тому же DoEvents с большой частотой вызовов в цикле небезопасен: что может произойти если он не успеет вернуть управление VB? :(

Тебе скорее всего нужно использовать API - Timer - он вообще проц. не грузит и может выполнять свою работу без зависаний.
Последний раз редактировалось awl100Alex 06.06.2009 (Сб) 22:02, всего редактировалось 1 раз.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Задерка по времени

Сообщение arthur2 » 06.06.2009 (Сб) 22:00

Чтобы избежать того "зависания", которое ты имеешь ввиду, нужно выйти из процедуры - другого варианта просто нет. Так что только таймер.
пример с таймером не совсем гибок. А если мне после задержки нужны переменные локольно объявленные до задержки?
Объяви статические переменные :)
Артур
 
   

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Задерка по времени

Сообщение awl100Alex » 06.06.2009 (Сб) 22:03

Вот посмотри пример здесь...
http://bbs.vbstreets.ru/viewtopic.php?p=6709202#p6709202

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

Re: Задерка по времени

Сообщение alibek » 06.06.2009 (Сб) 22:56

awl100Alex писал(а):Да и к тому же DoEvents с большой частотой вызовов в цикле небезопасен: что может произойти если он не успеет вернуть управление VB? :(

Глупость. Такого не бывает.
Lasciate ogni speranza, voi ch'entrate.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Задерка по времени

Сообщение awl100Alex » 06.06.2009 (Сб) 23:30

alibek писал(а):Глупость. Такого не бывает.

К сожалению бывает. По своему горькому опыту говорю. :( Тоже когда-то делал цикл for - DoEvents - Next и у меня после этого, рухнула система.
А потом уже читал такие вот советы...
http://vbrussian.com/Article.asp?ID=43 - Совет № 52.
И вот это...
http://vbzero.narod.ru/chapter1/page_22.htm
Цитирую...
"В связи с тем, что повторный вызов функции DoEvents в момент, когда функция еще не передала управление из операционной системы назад в Visual Basic может вызвать непредвиденные последствия, нежелательно вызывать процедуру DoEvents из других процедур программы."

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Задерка по времени

Сообщение ANDLL » 07.06.2009 (Вс) 0:00

Еще раз для тупых.
doevents не предназначена для передачи чегото оперционной системе. Любая статья, начинающаяся с подобного тезиса - просто плод больного воображения авторов, заменяющих реальные знания своей пылкой юношеской фантазией
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Задерка по времени

Сообщение awl100Alex » 07.06.2009 (Вс) 0:22

ANDLL писал(а):Еще раз для тупых.

Похоже свой голос дал безграмотный флудист. :mrgreen:

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Re: Задерка по времени

Сообщение 13GHOST » 07.06.2009 (Вс) 8:00

мда. Апи таймер это конечно хорошо но все осложняет. При нем надо объявлять статические переменные. А если например будет так: я перед задержкой в функции запишу все данные в стат. переменные и во время задержки эта функция вызовется еще раз с другими параметрми, получается она изменит содержание стат перменных + и то что после задержки вызовется 1 раз, хотя надо 2. Получается тут надо делать массивы таймеров + массивы перменных для каждого таймера, целый движок писать:) а если еще и зардержек в функции не 1 а много, то..... :(

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Задерка по времени

Сообщение Debugger » 07.06.2009 (Вс) 9:12

Вывод: GetTickCount + Do While ... Loop + Doevents

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

Re: Задерка по времени

Сообщение alibek » 07.06.2009 (Вс) 9:25

awl100Alex писал(а):К сожалению бывает. По своему горькому опыту говорю.

Не бывает. Ты понимаешь, что делает DoEvents? Видимо, нет.
Lasciate ogni speranza, voi ch'entrate.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Re: Задерка по времени

Сообщение 13GHOST » 07.06.2009 (Вс) 10:35

если бы работала многопоточность, то можно было бы всю процедуру поместить в отдельный поток и задержка с помощью doevents, тогда да. А так doevents не катит. Придется как то реализовывать псевдомногопоточность :)

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Задерка по времени

Сообщение arvitaly » 07.06.2009 (Вс) 12:03

Можно ли на VB6 организовать задержку между строками кода на определенное время?


А где так можно?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Задерка по времени

Сообщение arthur2 » 07.06.2009 (Вс) 12:40

многопоточность: viewtopic.php?f=15&t=39686&start=0&st=0&sk=t&sd=a
Только она здесь не поможет.

"массив" АПИ-таймеров (условно массив оберток над апи-таймером)
viewtopic.php?f=28&t=36606

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

Чтобы программа не замораживалась, всё равно придётся выходить из процедуры. Заведи кроме прочих статический счётчик, который при флаге увеличивай, а без флага уменьшай. Тогда каждый экземпляр твоей процедуры перед паузой сможет по этому индексу узнавать именно свою пару после паузы. А вместо переменных заведи массивы переменных - чтобы каждая пара "перед-после" пользовалась своей собственной переменной.
(Кстати, если пользоваться моим кирпичом - там к каждому таймеру как раз можно привязать свою переменную)

Может быть, ещё эта идея пригодится:
viewtopic.php?p=6699778#p6699778
Артур
 
   

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Re: Задерка по времени

Сообщение 13GHOST » 07.06.2009 (Вс) 12:49

ну понятно, спасибо. вопрос снят


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

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

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

    TopList  
cron