Timer

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Timer

Сообщение kif » 14.02.2006 (Вт) 13:29

ситуация:
есть процедура, которая запускается из таймера. проблема состоит в том, что выполнение процедуры происходит дольше чем интервал таймера и поэтому таймер как бы затыкается, т.е. не работает.

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

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 14.02.2006 (Вт) 13:30

ошибочка!!! :-(

чтобы таймер не ждал окончания ее выполнения, а запускал ее каждый раз при наступлении события Timer
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.02.2006 (Вт) 13:56

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

Получится ситуация:
событие наступило - запустилась процедура первый раз (№1)
событие наступило - запустилась процедура второй раз (№2), а №1 еще работает?

Процессор то один... Если в процедуру вставить DoEvents, то такое можно реализовать. Процедура №1 даст возможность сработать таймеру, а затем они будут выполняться по очереди...

Только вот нормально ли это, иметь две одновременно выполняющихся одинаковых процедуры?
Весь мир матрица, а мы в нем потоки байтов!

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 14.02.2006 (Вт) 16:20

doevents не помогает, таймер ждет окончания выполнения процедуры

две одновременно выполняющихся одинаковых процедуры это нормально, поотму что они запускаются с разными параметрами
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Grey_Brother
Новичок
Новичок
Аватара пользователя
 
Сообщения: 36
Зарегистрирован: 09.02.2006 (Чт) 10:36
Откуда: Санкт-Петербург

Сообщение Grey_Brother » 14.02.2006 (Вт) 18:03

Создай класс содержащий эту процедуру и в таймере декларируй как "NEW" :)
С уважением, GB.

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

Сообщение ANDLL » 14.02.2006 (Вт) 21:51

Создай класс содержащий эту процедуру и в таймере декларируй как "NEW" Smile

Хотелось бы знать, чем это поможет :?

Процессор то один...
Это не аргумент. В windows вполне можно считать что там куча процессоров...

Если в процедуру вставить DoEvents, то такое можно реализовать.
Ввиду особенности WM_TIMER не получится, хотя логически тебе может показаться обратное. Но WM_TIMER не срабатывает, если на данный момент этот таймер уже обрабатывается.
две одновременно выполняющихся одинаковых процедуры это нормально, поотму что они запускаются с разными параметрами
Неуверен, что у процедуры Timer есть параметры... Точнее они конечно есть, точнее один параметр :wink: Но он отвызова к вызову не изменится :wink:

Как я понимаю тебе важно что бы сообщения таймера накапливались. Однако боюсь это неправидьная архетектура. Что именно тебе нужно?[/b]
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.02.2006 (Вт) 22:49

Все проще, если я правильно понял суть проблемы.

Код: Выделить всё
private sub Timer1_Timer()
timer1.enabled=false

callprocedure() '...

timer1.enabled=true
end sub

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

Сообщение ANDLL » 14.02.2006 (Вт) 23:04

Нет, неправильно понял. Что по твому дает твой код?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 8:19

2 ANDLL
Но WM_TIMER не срабатывает, если на данный момент этот таймер уже обрабатывается.

Не верный ответ...
Попробуй-ка в таймер поставить MessageBox? Что видим? Кучу сообщений... Значит все таки обрабатывается.
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 8:33

2 kif
С чего ты вообще взял, что таймер не срабатывает второй раз из-за того что процедура не завершилась? Может просто до приложения не доходят сообщения WM_TIMER, так как процедура "забирает" все ресурсы?
К сожалению, ни чем не могу помочь, пока не увижу код... Хотя могу предположить, что DoEvents может помочь...
А я все практикую лечение травами...

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

Сообщение ANDLL » 15.02.2006 (Ср) 9:30

Не верный ответ... Попробуй-ка в таймер поставить MessageBox? Что видим? Кучу сообщений... Значит все таки обрабатывается.

Куча. Но WM_TIMER среди них нету ;) А если и есть, то не касательно "нашего" таймера.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.02.2006 (Ср) 10:03

kif писал(а):doevents не помогает, таймер ждет окончания выполнения процедуры

две одновременно выполняющихся одинаковых процедуры это нормально, поотму что они запускаются с разными параметрами


DoEvents должен вставляться в цикл процедуры. То бишь процедура таким образом будет отдавать события форме/таймеру и другой процедуре. Если в процедуре долго выполняется запрос к базе, то его надо выполнять асинхронно и в цикле проверки его завершени опять-же вызывать DoEvents.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 15.02.2006 (Ср) 10:25

проблема действительно в том, что у таймера не возникало событие Timer, я решил эту проблему 2-мя таймерами: один по условию подкидывает параметры в массив, а второй, если есть эти параметры, запускает процедуру с этими параметрами.

всем спасибо, тема закрыта.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 10:51

Автор закрыл тему, но я добавлю...
Куча. Но WM_TIMER среди них нету А если и есть, то не касательно "нашего" таймера.

Я не про сообщения. Я про MasgBox-ы. Их куча - следовательно: Таймер обрабатывает сообщения. Теперь про MsgBox, к чему я его взял - если поставить MsgBox в цикл, который, к примеру, ведет отсчет от 0 до 10, то ты увидишь 11 сообщений, но каждое лишь после предыдущего - следовательно, вызов MsgBox блокирует выполнение текущего потока до закрытия своего окна. А по таймеру они выскакивают - значит, не смотря на блокировку потока, таймеру приходят сообщения от системы, следовательно продолжительность выполнения какой-либо функции не может помешать работе таймера, его работе может помешать лишь цикл, который перехватывает все ресурсы процессора на себя. А бороться с этим нужно с помощью DoEvents...
А я все практикую лечение травами...

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

Сообщение GSerg » 15.02.2006 (Ср) 10:56

Касаемо msgbox и событий...
http://support.microsoft.com/default.as ... -us;178078
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение ANDLL » 15.02.2006 (Ср) 11:03

продолжительность выполнения какой-либо функции не может помешать работе таймера

Твоя ошибка заключается в том, что ты опять не правильно, видать понял и меня и автора топика.
Я ьы сказал так:
продолжительность выполнения какой-либо функции(кроме самой функии Timer'а) не может помешать работе таймера
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 11:15

Твоя ошибка заключается в том, что ты опять не правильно, видать понял и меня и автора топика.

Я люблю с тобой поспорить, ANDLL, хотя и не всегда оказываюсь прав. Но не в этот раз... :lol:
Но WM_TIMER не срабатывает, если на данный момент этот таймер уже обрабатывается.

Все прекрасно обрабатывается если до таймера доходят сообщения... А вот у автора они не доходят из-за цикла, который (процедура) вызывается из процедуры таймера. Почитай линк GSerg-а, создай проект, посмотри его из IDE, а потом скомпилируй и запусти EXE:
Running a project in the IDE that displays a message box prevents events from occurring. However, when you compile and run the same project as an executable file (EXE), the events occur while the message box is displayed.

Не наводит на мысли?... :wink:
А я все практикую лечение травами...

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

Сообщение ANDLL » 15.02.2006 (Ср) 11:36

Private Sub Timer1_Timer()'Timer1.Interval=1000
MsgBox "AAA"
End Sub
Не наводит :)

Если это даже откомпиилровать и ждать после появления первого MsgBox полчаса, то остальные MsgBox'ы будут вылазить(но только после закрытия MsgBox) с интервалом в одну секунду. Иными словами еще раз повторюсь, что ЕСЛИ В ОЧЕРЕДИ УЖЕ ЕСТЬ СООБЩЕНИЕ WM_TIMER, то еще одно ообщение(для этого же таймера) туда не добавится.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 11:48

Ох уж этот БАСИК!... Он меня с ума сведет со своими выкрутасами...
В нем твое утверждение имеет силу.
А ты попробуй создать таймер через SetTimer или попробуй свой код в Делфях - тут прав окажусь я! (проверял собственноручно в Delphi и MASMе) ...

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

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

Сообщение ANDLL » 15.02.2006 (Ср) 12:09

Такс, правильнее сказать не
что ЕСЛИ В ОЧЕРЕДИ УЖЕ ЕСТЬ СООБЩЕНИЕ WM_TIMER, то еще одно ообщение(для этого же таймера) туда не добавится

А что бэйсик обрабатывает WM_TIMER весьма интересным образом.
http://danasoft.ru/users/andll/screen1.JPG
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 12:15

Коментарий к ссылке ANDLL:
Сделано на Сях, в басике, конечно, так не получиться (если не юзать SetTimer)...

Как говориться, в споре рождается истина, не так ли, ANDLL? :lol:

Думаю на этом можно поставить точку... :)
А я все практикую лечение травами...

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

Сообщение ANDLL » 15.02.2006 (Ср) 14:48

Twister писал(а):Как говориться, в споре рождается истина, не так ли, ANDLL? :lol:

Да, это одна из моих дюбимых поговорок ;)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.02.2006 (Ср) 15:02

Да, это одна из моих дюбимых поговорок

Я заметил... А для меня это жизненное кредо!.. :lol:
А я все практикую лечение травами...

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Сообщение Drag » 16.02.2006 (Чт) 11:31

А у меня она немного изменена: "В споре рождаются сcоры".
А что, Timer1.interval = 0 не поможет?
Последний раз редактировалось Drag 16.02.2006 (Чт) 15:55, всего редактировалось 1 раз.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 16.02.2006 (Чт) 14:03

В споре рождаются соры

Ну не знаю насчет СОРА, но ссора получиться может. В этом случае нужно иметь такт и мозги... :lol:
А что, Timer1.interval = 0 не поможет?

Поможет ... остановить таймер. :roll:
А я все практикую лечение травами...


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

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

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList