Задержка?

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

Задержка?

Сообщение _Vasya » 16.04.2004 (Пт) 13:06

Нужно создать задержку на указаное количество миллисукунд, типа Delay() в Delphi???
Ел. упр. Timer плохо работает с интервалом в 1 миллисекунду а функция Timer возвращает только сотые секунды???
Может кто знает как это зделать???

Заранее благодарен.

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

Сообщение alibek » 16.04.2004 (Пт) 13:17

GetTickCount или использовать мультимедийный таймер.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Konst_One » 16.04.2004 (Пт) 13:19

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

Public Sub Idle(Optional msec As Long = 0)
Dim EndTime As Long
  EndTime = GetTickCount() + msec
  Do
    DoEvents
    Sleep 1
  Loop While GetTickCount() < EndTime
End Sub


_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 16.04.2004 (Пт) 13:50

Спасибо
Иду пробовать :)

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 16.04.2004 (Пт) 14:50

А
Код: Выделить всё
Sleep 1
там зачем?

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

Сообщение Konst_One » 16.04.2004 (Пт) 14:54

Это собственно и есть задержка в выполнении проги на 1 мс

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 16.04.2004 (Пт) 16:36

А это
Код: Выделить всё
Loop While GetTickCount() < EndTime

тогда зачем?, там все и без Sleep задерживает.

Но обидно то, что Sleep 1 в самом деле задерживает на 15-16 мс.
Код: Выделить всё
        t1 = GetTickCount
        Sleep 1
        MsgBox  GetTickCount - t1

выдаёт 15 :(

Что делать :?:

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

Сообщение alibek » 16.04.2004 (Пт) 16:49

Вот для того и надо, чтобы точнее задерживать.
Lasciate ogni speranza, voi ch'entrate.

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 16.04.2004 (Пт) 23:59

Да, без sleep 1 точнее.

Но вопрос уже в том как сделать задержку именно на 1 мс. При задании sleep 1 задерживает на 10-16, (на другом компе на 10)

Как зделать именно на 1 мс., так чтобы было точно на каждом компе???

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

Сообщение alibek » 17.04.2004 (Сб) 11:11

Дубль: используй мультимедийный таймер.
Lasciate ogni speranza, voi ch'entrate.

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 18.04.2004 (Вс) 0:56

:oops: Мультимедийный таймер это какой???

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 19.04.2004 (Пн) 9:21

Т. е. я хотел сказать как им пользоваться?
Может кто знает, помогите!

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

Сообщение alibek » 19.04.2004 (Пн) 9:43

Код: Выделить всё
'API-Guide
'This project requires a Form and a Module
'On the form, there should be one command button (Command1)
'and one Timer (Timer1)

'In the form:
Option Explicit
Private Sub Form_Load()
    'KPD-Team 2001
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Command1.Caption = "Start"
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Stop the timers if they're still counting
    timeKillEvent hMMTimer
    Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
    'increment VBTimer
    VBTimer = VBTimer + 1
End Sub
Private Sub Command1_Click()
    If Command1.Caption = "Start" Then
        'Start both timers
        Timer1.Interval = 1
        Timer1.Enabled = True
        hMMTimer = timeSetEvent(1, 0, AddressOf TimerProc, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
        Command1.Caption = "Stop"
    Else
        'Stop both timers
        timeKillEvent hMMTimer
        Timer1.Enabled = False
        Command1.Caption = "Start"
        'Show result
        MsgBox "Timer1_Timer was called " & VBTimer & " times;" & vbNewLine & "TimerProc was called " & MMTimer & " times."
        VBTimer = 0
        MMTimer = 0
    End If
End Sub
'In a module
Option Explicit
Public Const TIME_ONESHOT = 0  'Event occurs once, after uDelay milliseconds.
Public Const TIME_PERIODIC = 1  'Event occurs every uDelay milliseconds.
Public Const TIME_CALLBACK_EVENT_PULSE = &H20  'When the timer expires, Windows calls thePulseEvent function to pulse the event pointed to by the lpTimeProc parameter. The dwUser parameter is ignored.
Public Const TIME_CALLBACK_EVENT_SET = &H10  'When the timer expires, Windows calls theSetEvent function to set the event pointed to by the lpTimeProc parameter. The dwUser parameter is ignored.
Public Const TIME_CALLBACK_FUNCTION = &H0   'When the timer expires, Windows calls the function pointed to by the lpTimeProc parameter. This is the default.
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
Public VBTimer As Long, MMTimer As Long
Public hMMTimer As Long
Sub TimerProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
    'Increment MMTimer
    MMTimer = MMTimer + 1
End Sub
Lasciate ogni speranza, voi ch'entrate.

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 20.04.2004 (Вт) 0:40

Примного благодарен :)


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

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

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

    TopList