Как узнать, завершилась ли работа вызванного приложения?

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

Как узнать, завершилась ли работа вызванного приложения?

Сообщение dimix » 08.02.2005 (Вт) 23:00

Господа, у меня такая ситуация.
Через "Shell" запускаю на выполнение некоторый exe-файл. Следующее действие должно происходить после окончания работы exe-файла.

Вопрос:
1. Как узнать, что exe-файл закончил работу? (он сам закрывается).
2. Как реализовать в своей программе ожидание? (например, пока exe работает, программа делает недоступными некоторые элементы формы (например, кнопки), а когда exe затыкается, кнопки снова Enabled).

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

Сообщение tyomitch » 08.02.2005 (Вт) 23:06

1. GetExitCodeProcess (но тебе её не надо)
2. См. Waiter! от GSerg-а в Наших Проектах.
Изображение

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 10.02.2005 (Чт) 13:47

Спасибо за ответ. Waiter в проектах нашел, но не понял, где взять исходник. Смог ознакомиться только с кодом, приведенным в Вашем ответе. (http://bbs.vbstreets.ru/viewtopic.php?t=9996)

Вас не затруднит немного прокомментировать этот код? Меня интересует, что еще (кроме этого кода) мне нужно, чтобы использовать функцию ожидания в моей программе? Как и где указать exe, который нужно запустить?

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

Сообщение tyomitch » 10.02.2005 (Чт) 15:39

dimix писал(а):Спасибо за ответ. Waiter в проектах нашел, но не понял, где взять исходник. Смог ознакомиться только с кодом, приведенным в Вашем ответе. (http://bbs.vbstreets.ru/viewtopic.php?t=9996)

Да прямо там же, в том архиве, файл Waiter.ctl
Изображение

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

Сообщение tyomitch » 10.02.2005 (Чт) 17:50

Ок, вот детали.
1. Открой проект GSerg-а и замени код в форме на следующий:
Код: Выделить всё
Option Explicit

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const SYNCHRONIZE As Long = &H100000
Dim h As Long

Private Sub Form_DblClick()
  h = OpenProcess(SYNCHRONIZE, 0, Shell("notepad"))
  Waiter1.StartWait h
End Sub

Private Sub Form_Unload(Cancel As Integer)
If h Then
  Waiter1.TerminateWait
  CloseHandle h
End If
End Sub

Private Sub Waiter1_Complete()
  MsgBox "Блокнот закрыт!!"
End Sub


Когда ты дважды кликнешь на форме, то запустится блокнот. Когда ты закроешь блокнот - прога выведет сообщение об этом.

2GSerg: я бы на твоём месте именно этот пример использования Waiter-а с ним и прилагал. Эвент - это как-то ненаглядно...
Изображение

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

Сообщение GSerg » 11.02.2005 (Пт) 11:48

Зато лениво - а я в тот момент ковырялся именно с эвентами :)

Эх :)
Ладно, пофиксят сетку, заменю :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 11.02.2005 (Пт) 12:45

tyomitch, большое спасибо за F1!

А про скачивание проекта - я просто стормозил. Зашел не залогинившись, вот и не увидел, откуда файл качать. :(

(Нифига не ламер!)

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 11.02.2005 (Пт) 22:20

А что это такое: Option Explicit?

Из-за этого зверя у меня возникает ошибка, например в случае

Private Button_Click()
SelQ = Expl.SelectedFiles.Count
...


А если Option Explicit убрать, то все работает. Но я так понимаю, оно там не спроста написано :wink:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.02.2005 (Пт) 22:28

Option Explicit - фича, при которой все переменные надо объявлять.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 11.02.2005 (Пт) 23:25

A.A.Z. писал(а):Option Explicit - фича, при которой все переменные надо объявлять.


1. А что это дает?

2. Чем чревато то, что из описанного выше кода я убрал эту фичу?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 12.02.2005 (Сб) 0:36

Ну...
Эта фича полезна при:
а) Случайном перепутывании имени переменной. Например, ты объявишь переменную
Dim MyLongPeremennaya As Long
А потом в коде напишешь
MyLongPeremennya = ...
И будешь долго соображать, почему у тебя результат не тот.
б) Т.к. без этой фичи VB все неизвестные доселе переменные объявляет как Variant (если не указано Def***), то может где-то возникнуть несоответствие типов (например, при переходе от строк к числам и/или от целых чисел к дробным)
в) Самому легче будет управляться при четко объявленных переменных. Не будет путаницы "а это откуда?..", "а какого это типа должно было быть?.." и т. д.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 14.02.2005 (Пн) 20:06

А как применительно к коду, приведенному выше tyomitch'ем, соответственно, применительно к проекту Waiter! от GSerg, сделать так, чтобы окно exe-шника, вызываемого через Shell, не отображалось на экране? Я видел пример, в котором окно не отображается, но, в отличие от проекта GSerg'а, при ожидании завершения процесса сама программа "замирала". Вариант от GSerg и tyomitch меня полностью устраивает, но можно ли используя его скрыть окно exe-шника?

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

Сообщение tyomitch » 14.02.2005 (Пн) 21:22

Можно. Shell("notepad") замени на Shell("notepad", 0)
Изображение


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 141

    TopList  
cron