Таймер глючит

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

Таймер глючит

Сообщение Densil » 02.03.2006 (Чт) 17:07



Обнаружил непонятное явление с таймером в VB6. Например, нужно посчитать - сколько времени пройдёт между нажатием кнопки1 и нажатием кнопки2. Код для таймера простой: Переменная1 = Переменная1 + 1
(1 кнопка вкл. таймер, 2 кнопка - откл. таймер и выдать полученный результат)
Нажимаю кнопку1, засекаю на секундомере 5 секунд и нажимаю на кнопку2. Что получается:
Если выставить интервал таймера 1000 милисекунд - всё нормально, результат 5;
если выставить 100 милисекунд - результат уже 47 (вместо 50);
если выставить 10 милисекунд - результат примерно 330 (вместо 500);
выставляю интервал 1 мсек - результат опять 330 :?:
В чём тут может быть дело ???

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.03.2006 (Чт) 17:14

Код: Выделить всё
Dim tm as Single
Private Sub Command1_Click()

tm=Timer()

End sub

Private Sub Command2_Click()

Debug.Print "Interval: " & Timer - tm

End sub

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.03.2006 (Чт) 17:27

А почему всё же этот код не рабатает?
(p.s. l1 - это этикетка)
Код: Выделить всё
Option Explicit
Dim p1 As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
Timer1.Enabled = False
l1.Caption = p1
p1 = 0
End Sub

Private Sub Timer1_Timer()
p1 = p1 + 1
End Sub

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.03.2006 (Чт) 17:28

В смысле не работает :D

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.03.2006 (Чт) 17:40

а потому, что не правильный

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.03.2006 (Чт) 17:50

Хм... Если вам не трудно, объясните плиз, в чём тут ошибка. Казалось бы всё просто как дважды два. Объект "таймер" включить - объект "таймер" выключить и записать результат в поле этикетки. Таймер каждый свой цикл прибавляет единицу к переменной. Где тут нестыковка? :(

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.03.2006 (Чт) 17:55

в самой постановке вопроса и в его решении:
нужно посчитать - сколько времени пройдёт между нажатием кнопки1 и нажатием кнопки2


попробуйте использовать хотя бы код, что я привел

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

Сообщение alibek » 02.03.2006 (Чт) 19:08

Densil писал(а):Если вам не трудно, объясните плиз, в чём тут ошибка.

В том, что Windows не является системой реального времени.
Во-первых, у таймера неидеальная точность, меньше 50мс вообще не имеет смысла выставлять.
Во-вторых, таймер может и не тикать в некоторых случаях.
А в-третьих, вообще не следует считать время в таймере. Считай разницу значениями Timer или API GetTickCount, а в таймере ее только перерассчитывай.
Lasciate ogni speranza, voi ch'entrate.

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 03.03.2006 (Пт) 7:39

Спасибо, всё работает! Правда я принцип работы не совсем понял. :? Timer() - это встроенная функция? И почему если давнёшь сразу Command2, возникает ошибка "переполнение" (правда я исключил в коде такую возможность, но хотелось бы разобраться). Заранее благодарен почтенной публике за любые разъяснения . :)

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

Сообщение Viper » 03.03.2006 (Пт) 12:22

Timer - это действительно встроенная функция, но если нажать сразу Command2, то по идее переполнения произойти не должно, не чему переполняться
Весь мир матрица, а мы в нем потоки байтов!


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

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

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

    TopList