Timer API

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

Timer API

Сообщение SyncM » 04.02.2007 (Вс) 16:45

Добрый день
У меня возникла проблема с таймером.
Мой предыдущий таймер окозался пакостью для CPU загружая его без совести и жалости.
Вот этот код.

Код: Выделить всё
Public Declare Function GetTickCount Lib "kernel32" () As Long


Do
DoEvents
  If GetTickCount() - LstTim >= Interval Then

  LstTim = GetTickCount
  Call tim ' вызываю sub tim()  с кодом выполнения

End If
Loop


Но я вынужден отказатся от его применения
Но к сожелению с Айпи шным таймером у меня проблемы

Мне не удаётся его привязать к чему быто ни было. Тоесть я не могу определить для него хэндл. Так как в моём проекте не имеется формы ( окна ) Но а если я следую следующим образом, то переменная по которой передаётся данный хэндл таймера обнуляется по неизвестной причине. Переменная, что получает так называемый хэндл изначально hTimer. Если проверить изначально, то она действительно имеет адрес хэдла таймера.

вот код

Код: Выделить всё
Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

Dim stop1 As Long
Dim hTimer As String

Function TimerProc(hWnd As Long, nIDEvent As Long, uElapse As Long, lpTimerFunc As Long)

MsgBox hTimer ' уже здесь переменная пуста
If stop1 > 5 Then
KillTimer w, 0&
MsgBox "stop timer"
End If
stop1 = stop1 + 1

End Function


Sub main()

hTimer = SetTimer(0&, 0&, 2000, AddressOf TimerProc)

End Sub


Помогите если можете. Есть ли альтернатива этому таймеру или же подскажите как избежать потери данных в переменной. Проект основан на одном модуле, и двух классах. При этом в конце я копилирую DLL. Тоестья просто создаю DLL.
Спасибо

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

Сообщение dr.MIG » 04.02.2007 (Вс) 16:55

Dim hTimer As String

Ужас...
Может конечно не в этом дело, но всё равно ужас...

Dim hTimer As Long
Salus populi suprema lex

SyncM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 04.02.2007 (Вс) 15:48

Сообщение SyncM » 04.02.2007 (Вс) 17:22

dr.MIG
Я понимаю ваш ужас, но там было и Variant, Integer, Long. И ничего не сработало. (((

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 04.02.2007 (Вс) 18:19

nIDEvent заполни сам любым числом.
Если всё делать своими ручками, они скоро отвалятся !

SyncM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 04.02.2007 (Вс) 15:48

Сообщение SyncM » 04.02.2007 (Вс) 20:13

Kovu
вероятно я один у кого не работает данная функция

а может через

Dim tim as Timer
tim.Enabled = True
tim.Interval = 1000

выкидывает ошибку, что чтото не определено.
Всё этов модуле.
Чтож
выхода не вижу.

zan
Бывалый
Бывалый
 
Сообщения: 224
Зарегистрирован: 24.08.2006 (Чт) 4:55

Сообщение zan » 05.02.2007 (Пн) 4:42

Пример работы с «SetTimer»
Вложения
SetTimer.zip
(1.62 Кб) Скачиваний: 66

SyncM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 04.02.2007 (Вс) 15:48

Сообщение SyncM » 09.02.2007 (Пт) 21:58

zan
к сожелению для данного примера мне не удалось ничего сделать
я не смог выруюить таймер
так как мне не нужна форма, ибо форма содержит объекты
мне же нужно свестись всё к минимуму

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

Сообщение Хакер » 09.02.2007 (Пт) 23:59

SyncM писал(а):а может через

Dim tim as Timer
tim.Enabled = True
tim.Interval = 1000

выкидывает ошибку, что чтото не определено.
Всё этов модуле.
Чтож
выхода не вижу.


Без формы не получится. Обязательнос таймер должен быть на форме. Если так уж охота создавать его кодом, то

Dim WithEvents tim As Timer

а потом
Код: Выделить всё
Set tim = SomeForm.Controls.Add("VB.Timer", "tim")
tim.Enabled = True
tim.Interval = 1000
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 11.12.2007 (Вт) 23:21

Скажите а можно на одной форме использовать два API таймера?
Адреса процедур ведь разные,хотя hWND один... :roll:

Nic.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.12.2007 (Ср) 5:03

SyncM писал(а):... я не смог выруюить таймер
так как мне не нужна форма, ибо форма содержит объекты
мне же нужно свестись всё к минимуму


Попробуй так:

Код: Выделить всё
Option Explicit
Type MSG
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As Long
End Type

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)

Dim stop1 As Long
Dim hTimer As Long

Function TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long) As Long
    Debug.Print time
    If stop1 > 5 Then stoptimer
    stop1 = stop1 + 1
End Function

Sub stoptimer()
    PostQuitMessage (0)
End Sub

Sub main()
    Dim pmsg As MSG
    hTimer = SetTimer(0&, 0&, 1000, AddressOf TimerProc)
   
    While GetMessage(pmsg, 0, 0, 0)
        DispatchMessage pmsg
    Wend
   
    KillTimer 0, hTimer
End Sub


SyncM писал(а):Мой предыдущий таймер окозался пакостью для CPU загружая его без совести и жалости.


Код: Выделить всё
 
Do
DoEvents
Sleep 10 'Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Loop

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.12.2007 (Ср) 10:16

Ужос!
Срочно заценить хрестоматийный пример.
Вложения
XTIMER.rar
(1.09 Кб) Скачиваний: 58
Лучший способ понять что-то самому — объяснить это другому.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.12.2007 (Ср) 11:24

Antonariy писал(а):Ужос!
Срочно заценить хрестоматийный пример.


Расскажи, как твоя херстоматия будет работать в программе имеющей только sub Main?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.12.2007 (Ср) 11:59

Программе, имеющей только sub main, таймер не нужен. Ей нужен sleep.
Лучший способ понять что-то самому — объяснить это другому.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.12.2007 (Ср) 12:08

Antonariy писал(а):Программе, имеющей только sub main, таймер не нужен. Ей нужен sleep.

Именно это я и предложил, так в чем ужас?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.12.2007 (Ср) 12:11

Ужас это все остальные варианты.
Лучший способ понять что-то самому — объяснить это другому.


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

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

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

    TopList