Таймер

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

Таймер

Сообщение Ruslan2000 » 19.02.2008 (Вт) 12:04

Привет. Подскажите, пожалуйста, я чегото не понимаю или это глюг программы, но не работает:

Public forto1,forto2 as long

Sub wait()
forto1 = 0
Form1.Timer1.Interval = 10
Form1.Timer1.Enabled = True
For forto2 = 1 To 1000000000
Next
Form1.Timer1.Enabled = False
MsgBox (forto1)
End Sub

Public Sub Timer1_Timer()
forto1 = forto1 + 1
End Sub


Msgbox пишет 0, таймер не работает.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Re: Таймер

Сообщение CodeName33 » 19.02.2008 (Вт) 12:59

Код: Выделить всё
Sub wait()
forto1 = 0
Form1.Timer1.Interval = 10
Form1.Timer1.Enabled = True
For forto2 = 1 To 1000000000
DoEvents ' !!!!!!!!!!
Next
Form1.Timer1.Enabled = False
MsgBox (forto1)
End Sub

Public Sub Timer1_Timer()
forto1 = forto1 + 1
End Sub


Только это тоже не правильно. Лучше пользоваться Sleep - тогда программа не будет грузить систему.
Код: Выделить всё
Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)

Sub wait()
forto1 = 0
Form1.Timer1.Interval = 10
Form1.Timer1.Enabled = True
For forto2 = 1 To 100
Sleep(1)
DoEvents
Next
Form1.Timer1.Enabled = False
MsgBox (forto1)
End Sub

Public Sub Timer1_Timer()
forto1 = forto1 + 1
End Sub
Программисты не глючат - глючат компиляторы...

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 19.02.2008 (Вт) 13:09

Сорри за вопрос, :oops: но что за операторы
Sleep(1)
DoEvents

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

Сообщение Twister » 19.02.2008 (Вт) 14:07

Это не операторы.
Вызов DoEvents, грубо говоря, разрешает программе обрабатывать очередь сообщений. Ты сможешь таскать главное окошко и не лицезреть повисшее приложение.
Sleep - функция из kernel32.dll, заставляющая текущий поток заснуть на указанное кол-во милисекунд.
А я все практикую лечение травами...

Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Сообщение Ruslan2000 » 19.02.2008 (Вт) 15:12

Спасибо, Doevents помогло. Sleep не годится для подсчета времени, потому как Sleep <50 это 70-150 мс реальной задержки, на выполнение винапи процедуры на компе уровня пентюх-4 + подвисание процесса. К тому же задержка сильно зависит от загрузки компьютера. Все это проверено на практике.Таймер VB работает намого точнее, там где нужны четкие интервалы времени.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.02.2008 (Вт) 15:32

Ruslan2000 писал(а):Спасибо, Doevents помогло. Sleep не годится для подсчета времени, потому как Sleep <50 это 70-150 мс реальной задержки, на выполнение винапи процедуры на компе уровня пентюх-4 + подвисание процесса. К тому же задержка сильно зависит от загрузки компьютера. Все это проверено на практике.Таймер VB работает намого точнее, там где нужны четкие интервалы времени.


Слишком частый DoEvents загружает состему и порой вызывает большие задержки. Насчёт 70-150 мс задержки от Sleep - это странно. У меня на разных компьютерах при Sleep(1) - задержка в районе 10-15 мс. Таймер не может работать с интервалом 10мс. На деле меньше 15мс не получается. Если необходима высокая точность, лучше организовать непрерывный цикл и мерить реально протИкавшие миллисекунды. + установить приложению повышенный приоритет.
Программисты не глючат - глючат компиляторы...

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

Сообщение Хакер » 19.02.2008 (Вт) 15:47

Ruslan2000
Вот ведь, а. Как же часто приходится видеть таких персонажей, которые публично судят о поведении и, в частности, мнимой тормознутости некоторых API-функций. В 90% всех случаев однако же оказывается, что персонаж работает через Declare Function и не знает в нужной (для того чтобы иметь право судить о тормознутости) степени, что это за зверь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 19.02.2008 (Вт) 16:14

Если быть точным, то Sleep меньше 10 мс. при стандартных условиях(до вызова BeginTimePeriod с меньшим разрешением) все равно невозможен. А самая тема, это то, что Sleep(50) может быть равен и 50, и 70, и 150 мс.. Но не менее 50. Это уже винда. =)
Так что он для измерения времени в принципе не годится.
label:
cli
jmp label

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 19.02.2008 (Вт) 16:40

Надо что-то навроде:
Код: Выделить всё
Dim TimeAtStart as single
...
Sub WeitTime(TimeA as single)
TimeAtStart = Timer
Do while TimeAtStart-Timer < TimeA
  DoEvents 'если требуется ппц точность, то без DoEvents
loop
end sub
?

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 20.02.2008 (Ср) 1:01

ИМХО Если требуется ппц точность юзать надо GetSystemTime.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 20.02.2008 (Ср) 7:34

|kerish| писал(а):ИМХО Если требуется ппц точность юзать надо GetSystemTime.


Юзать надо:
Код: Выделить всё
Public Declare Function QueryPerformanceCounter Lib "kernel32" Alias "QueryPerformanceCounter" (lpPerformanceCount As LARGE_INTEGER) As Long
Public Declare Function QueryPerformanceFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" (lpFrequency As LARGE_INTEGER) As Long

:)

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

Сообщение Twister » 20.02.2008 (Ср) 10:01

К тому же задержка сильно зависит от загрузки компьютера. Все это проверено на практике
Плохая практика. Задержка ни коим образом не зависит от загрузки камня. А вот точность таймера зависит и то что ты сказал - полный бред:
Таймер VB работает намого точнее, там где нужны четкие интервалы времени.
А я все практикую лечение травами...


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

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

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

    TopList