Прервать процесс

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

Прервать процесс

Сообщение Skarobey » 24.08.2005 (Ср) 3:19

как прервать выполнение процесса не зависимо какую часть кода он выполняет...

щас у меня стоит
If GetAsyncKeyState(13) Then Exit Sub
или что-то в этом роде, точно не помню...
но стоит у меня в середине Sub и тутже задействованы функции продолжительные по времени...и чтоб остановить процесс (интер) приходится зажимать интер и ждать пока процесс дойдет до данной проверки.

так как сделать выход независимо от того какой кусок кода выполняет прога?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.08.2005 (Ср) 3:42

Сделать кнопку Отмена, назначить ей Cancel = True, в её коде прописать остановку, а во всех процедурах - DoEvents.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 24.08.2005 (Ср) 3:58

что именно значит DoEvents ? :oops:

а кнопкой не выйдет т.к. форма у меня не активна во время выплнения.

может как-то через таймер передать остановку Sub?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 24.08.2005 (Ср) 7:23

делай в неактивной форме проверку например какой нить переменной, если она true, то останавливай процесс
переменную обьяви в модуле или в форме (public переменная as boolean)
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 24.08.2005 (Ср) 18:31

так эту проверку тоже надо вставлять в середину кода и тоже будет проверятся 1 раз ито когда до нее доползет.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 24.08.2005 (Ср) 18:42

а почему бы её не встроить в трех местах кода: в начале, в середине и в конце :roll:
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

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

Сообщение Kovu » 25.08.2005 (Чт) 8:21

lord0n
Пользователь может захотеть прервать процесс в любом месте.
Skarobey
Если использовать таймер то надо проверять постоянно с начала запуска процедуры, а это грузит процессор по конкретному.
Если всё делать своими ручками, они скоро отвалятся !

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 25.08.2005 (Чт) 15:23

88
Последний раз редактировалось Al Khamid 03.11.2007 (Сб) 17:04, всего редактировалось 1 раз.
"Время пришло..." ©

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 26.08.2005 (Пт) 0:19

do while i<50000
i =i+1
Sleep 3000
loop

вот захотел остановить на первой секунде выполнения (нажатием кнопки)...как?

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

Сообщение uhm » 26.08.2005 (Пт) 9:12

Про DoEvents не почитал, конечно?

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 26.08.2005 (Пт) 22:25

вот интересно, все вроде работает(инсерт-старт, интер-стоп), стартует и останавливает гуд... но когда добавляешь sleep, он не в какую не хочет останавливать!!! только в том случии если я удерживаю кнопку остановки.... может у меня из-за еэтого не получается?...

может есть альтернатива sleep'y ??


Dim stopp As Boolean
Dim i As Integer

Private Sub Command1_Click()
'Sleep 3000
i = i + 1
Text1.Text = i
End Sub

Private Sub Timer1_Timer()
If stopp = True Then
Do While DoEvents()
Command1_Click
Exit Do
Loop
End If
End Sub

Private Sub Timer2_Timer()
If GetAsyncKeyState(13) <> 0 Then stopp = False
If GetAsyncKeyState(45) <> 0 Then stopp = True
End Sub

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

Сообщение tyomitch » 26.08.2005 (Пт) 23:17

Do While DoEvents() рулит :-))

Если серьёзно, то как-то у тебя всё странно. Зачем тебе вообще GetAsyncKeyState? Form_KeyDown вроде как намного лучше таймера в отношении загрузки процессора.
Изображение

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 26.08.2005 (Пт) 23:43

это тестовый код, а так у меня другой, этот похож...
у меня активное окно не моего екзешника, но мышка управляется моим... что-то типо кликера... и останавливать получится только клавой. вот...
так что нащет альтернативы слипа?

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 27.08.2005 (Сб) 1:53

нашел на форуме альтернативу

Код: Выделить всё
Function Delay(Pause As Single)
Dim Start As Single
Start = Timer
Do While Timer < Start + Pause
DoEvents
Loop
End Function


но вставив ее проблема решилась частично... т.е. теперь хоть останавливается, но после нажатия клавиши остановки делает еще 1 цыкл Function Delay :cry:

Код: Выделить всё
Dim stopp As Boolean
Dim i As Integer

Private Sub Command1_Click()
Delay 5
i = i + 1
Text1.Text = i
End Sub

Private Sub Timer1_Timer()
    If stopp = True Then
        Do While DoEvents()
        Command1_Click
        Exit Do
        Loop
    End If
End Sub

Private Sub Timer2_Timer()
If GetAsyncKeyState(13) <> 0 Then stopp = False
If GetAsyncKeyState(45) <> 0 Then stopp = True
End Sub

Function Delay(Pause As Single)
Dim Start As Single
Start = Timer
Do While Timer < Start + Pause
DoEvents
Loop
End Function

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 27.08.2005 (Сб) 2:22

все, разобрался :D
Код: Выделить всё
Private Sub Timer1_Timer()
DoEvents
    If stopp = True Then


и

Код: Выделить всё
Do While Timer < Start + Pause
If GetAsyncKeyState(13) <> 0 Then Exit Do
DoEvents
Loop


всем спасибо за подсказки :!:


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

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

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

    TopList