Как организовать ПАУЗУ или Задержку

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

Как организовать ПАУЗУ или Задержку

Сообщение zaf » 03.07.2006 (Пн) 15:50

Добрый день!

Как можно организовать паузу скажем на 1,5 сек в коде?

Чтобы если код выполнился до этого места остановился на полтора сек и продолжил.

help plzz

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.07.2006 (Пн) 16:01

Sleep
Изображение

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 03.07.2006 (Пн) 16:05

Можно например так:
1.На форму поставить Timer. В свойстве Interval установить 1500(1,5 сек)
2.Ввести переменную типа MayCompile As Boolean
3. При загрузке формы установить значение в False
4. Когда нужно включить Timer и в событии прописать:
Private Sub Timer1_Timer()
MayCompile = True
Timer1.Enabled = False
End Sub

А вот примерный код процедуры:
Код: Выделить всё

Dim mayCompile As Boolean

Private Sub Form_Load()
' Нужно установить в таймере свойство Timer1.Enabled = False
'Код
MayCompile = False
Timer1.Enabled = True
If MayCompile = True Then
'//Код после паузы
End If
End Sub
#define ROFL 0xDDDD

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.07.2006 (Пн) 16:11

DirectXManiac, твоя процедура не заработает.
Изображение

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 03.07.2006 (Пн) 16:16

почему у меня работает! Я так делал перерыв между нажатиями клавиш! Чтоб сделать через DirectX окно для ввода текста =) Может щас что-то напутал! :(
#define ROFL 0xDDDD

zaf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 27.03.2006 (Пн) 23:04

Сообщение zaf » 03.07.2006 (Пн) 16:17

DirectXManiac писал(а):Можно например так:
1.На форму поставить Timer. В свойстве Interval установить 1500(1,5 сек)
2.Ввести переменную типа MayCompile As Boolean
3. При загрузке формы установить значение в False
4. Когда нужно включить Timer и в событии прописать:
Private Sub Timer1_Timer()
MayCompile = True
Timer1.Enabled = False
End Sub

А вот примерный код процедуры:
Код: Выделить всё
Dim mayCompile As Boolean

Private Sub Form_Load()
' Нужно установить в таймере свойство Timer1.Enabled = False
'Код
MayCompile = False
Timer1.Enabled = True
If MayCompile = True Then
'//Код после паузы
End If
End Sub


Я изначально так сделал

100 If a = true then Goto 100

Только прога завилса


:lol: If MayCompile = True Then
'//Код после паузы
End If

так код выпонится недожидаясь того когда MayCompile = True
Последний раз редактировалось zaf 03.07.2006 (Пн) 16:24, всего редактировалось 1 раз.

zaf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 27.03.2006 (Пн) 23:04

Сообщение zaf » 03.07.2006 (Пн) 16:17

tyomitch писал(а):Sleep


Вылазит окошко и матерится
Sub or Function not defined


как исправить?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 03.07.2006 (Пн) 16:24

Declare её, declare :)
Быть... или не быть. Вот. В чём вопрос?

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 03.07.2006 (Пн) 16:26

А вот и примерчик из MSDN. Тут ещё попутно показано как использовать функцию wait.
Код: Выделить всё

Option Explicit

' Sleep API is declared in the form to keep the
' SetWaitableTimer code in its own re-usable module.
Private Declare Sub Sleep Lib "kernel32" ( _
    ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
    Command1.Enabled = False
    Wait 10 ' seconds
    Command1.Enabled = True
End Sub

Private Sub Command2_Click()
    Command2.Enabled = False
    Sleep 10000 ' milliseconds
    Command2.Enabled = True
End Sub

Private Sub Form_Load()
    With Form1
        .Height = 1400
        .Width = 2400
    End With
    With Command1
        .Move 100, 100, 2000, 300
        .Caption = "SetWaitableTimer"
    End With
    With Command2
        .Move 100, 500, 2000, 300
        .Caption = "Sleep"
    End With
End Sub
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 17.03.2007 (Сб) 17:11

Пример из MSDN я видел.

а вот с TimerAPCProc проблемы, есть идеи как реализовать? Asynchronous Procedure Calls + vb = Есть подводные камни ?

Добавленно

В примере из MSDN заменил MsgWaitForMultipleObjects на MsgWaitForMultipleObjectsEx

TimerAPCProc
Код: Выделить всё

Public Function TimeOutEvent(ByVal lpArgToCompletion As Long, ByVal dwTimerLow As Long, ByVal dwTimerHigh As Long) As Long
    '
End Function


Вызов:
Код: Выделить всё

lRet = SetWaitableTimer(hTimer, ft, 0&, AddressOf TimeOutEvent, 0&, False)
   
    Do
        lBusy = MsgWaitForMultipleObjectsEx(1, hTimer, INFINITE, QS_ALLINPUT&, 2&)
        DoEvents
    Loop Until lBusy = WAIT_OBJECT_0


Че не так непойму - :roll: видать чет упустил ?

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

Сообщение alibek » 17.03.2007 (Сб) 20:26

DirectXManiac писал(а):1.На форму поставить Timer. В свойстве Interval установить 1500(1,5 сек)

Самый плохой совет. Дальше можно не читать.
Interval=1500 означает, что событие Timer сработает в любой момент после запуска таймера от 0с до 1.5с.
Lasciate ogni speranza, voi ch'entrate.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 7:07

Может мне кто-нить объяснить в чем разница в работе между MsgWaitForMultipleObjectsEx и SleepEx, в купе с SetWaitableTimer , я честьно читал но чет тяжело доходит. в аттаче отложенный таймер + SleepEx. MsgWaitForMultipleObjectsEx - ??? или другая может какая :roll:
Вложения
WrongProgrammingWay2.rar
(1.86 Кб) Скачиваний: 56

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.03.2007 (Вс) 11:13

Dmitriy2003, ты лучше объясни по-русски, что конкретно тебе нужно, и чем обычный таймер не устроил.
Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 16:16

tyomitch писал(а):Dmitriy2003, ты лучше объясни по-русски, что конкретно тебе нужно, и чем обычный таймер не устроил.


1. Почему TimerAPCProc не вызывается ? (MsgWaitForMultipleObjectsEx, про периодику молчу.)
2. Ничего против обычного таймера не имею. (но это не значит что нужно именно его использовать).

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.03.2007 (Вс) 16:54

Скачал аттач, запустил, работает.
В чём вопрос, так и не понял.
Зачем вместо FindWindow[Ex] используется Enum[Child]Windows, так и не понял.
Зачем вместо поиска контрола по ID (&H130) используется привязка к заголовку, зависящему от языка системы, тоже не понял.
Считай, совсем ничего в этом коде не понял :-)
Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 17:09

tyomitch писал(а):В чём вопрос, так и не понял.

Работает потому-что SleepEx, а если с MsgWaitForMultipleObjectsEx то не работает. Почему ?

tyomitch писал(а):Зачем вместо FindWindow[Ex] используется Enum[Child]Windows, так и не понял.Зачем вместо поиска контрола по ID (&H130) используется привязка к заголовку, зависящему от языка системы, тоже не понял.

Это не существенно.(это код тут побоку), хотя еще впоросик ID (&H130) во всех версиях винтукея ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.03.2007 (Вс) 18:21

MSDN писал(а):Note that you cannot use WaitForSingleObjectEx to wait on the handle to the object for which the APC is queued. Otherwise, when the asynchronous operation is completed, the handle is set to the signaled state and the thread is no longer in an alertable wait state, so the APC function will not be executed. However, the APC is still queued, so the APC function will be executed if you call another alertable wait function.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.03.2007 (Вс) 19:24

Если ничего не декларировать, то можно так:
Код: Выделить всё
t=Timer
Do While timer - t < 1.5
Loop

Можно в цикл вставить DoEvents, но это может быть опасно - зависит от остального кода.
А вообще лучше, конечно, Sleep.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 19:57

tyomitch писал(а):
MSDN писал(а):Note that you cannot use WaitForSingleObjectEx to wait on the handle to the object for which the APC is queued. Otherwise, when the asynchronous operation is completed, the handle is set to the signaled state and the thread is no longer in an alertable wait state, so the APC function will not be executed. However, the APC is still queued, so the APC function will be executed if you call another alertable wait function.


Сам просил по русски, пишеш однако по англиски. Не думаю что тебе сложно, наверно просто не хочеш.

Тогда может кто-нить кто еще русский не забыл - обьяснит по русски.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.03.2007 (Вс) 20:35

По-русски и коротко: от WaitableTimer-а надо юзать либо хэндл, либо процедуру завершения, но не обе одновременно.
Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 20:50

То-есть, если я правильно понял, в MsgWaitForMultipleObjectsEx можно юзать какой нить евент, в это время TimerAPCProc c интервалом 1000 мс будет работать. Как надоест просто сбросить евент. (к примеру) ? или опять мимо ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.03.2007 (Вс) 22:23

Угу, верно. Только не сбросить, а наоборот, установить, чтобы удовлетворить ожидание.
Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 18.03.2007 (Вс) 23:21

Наконец-то я добрался до истины, вот так всегда, сразу вспоминаеш подпись Gserg. Огромное человеческое спасибо tyomitch - за терпение и понимание. Respect :)


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

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

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

    TopList