Как дождаться конца работы приложения

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

Как дождаться конца работы приложения

Сообщение sportler » 05.04.2004 (Пн) 18:24

Из макроса Access запускаю FTP для отправки одного и приема другого файла. Надо дождаться конца обмена. Как определить что FTP отработал?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.04.2004 (Вт) 10:07

Если бы у меня было много свободного времени и желание выпендриться, то я бы использовал API
Код: Выделить всё
Private Declare Function WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long


Для того чтобы дождаться конца работы FTP клиента.

sportler
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 05.04.2004 (Пн) 17:43
Откуда: Рязань

Сообщение sportler » 06.04.2004 (Вт) 11:24

Большое спасибо! Если я правильно понял, то dwMilliseconds - ограничение времени работы процесса. Так? А как разобраться - закончился процесс или кончилось время? Что возвращается? В VB я чайник, а время лазить по manual & help'ам НЕТ!!! Помогите пожалуйста.

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

Сообщение GSerg » 06.04.2004 (Вт) 14:57

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

Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Sub Form_Load()
  Dim p As Long
  Me.AutoRedraw = True
  Me.Show
  Me.Print "Открыли кулькулятор. Ждём."
  DoEvents
  p = OpenProcess(0, 0, Shell("calc.exe", vbNormalFocus))
  WaitForSingleObject p, &HFFFFFFFF
  CloseHandle p
  Me.Print "Калькулятор закрыли!!!"
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 06.04.2004 (Вт) 15:27

Другой вариант - таймаут ставишь на ноль и делаешь такую проверку:
Код: Выделить всё
CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
Do
  GetExitCodeProcess proc.hProcess, ret
  DoEvents
Loop While ret = STILL_ACTIVE


Тогда твоя программа не будет "висеть", пока запускаемая программа будет выполняться
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 06.04.2004 (Вт) 15:31

Подумал и решил дать полный код.
Код: Выделить всё
Option Explicit

Public Type STARTUPINFO
  cb As Long
  lpReserved As String
  lpDesktop As String
  lpTitle As String
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type

Public Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type

Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib "kernel32" (ByVal _
   lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
   lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
   ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
   ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
   lpStartupInfo As STARTUPINFO, lpProcessInformation As _
   PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Const STILL_ACTIVE = &H103&

'Запустить
Public Function ExecCmd(CmdLine As String) As Long
Dim ret As Long
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Start.cb = Len(Start)
ret = CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
DoEvents
ret = WaitForSingleObject(proc.hProcess, INFINITE)
Call GetExitCodeProcess(proc.hProcess, ret)
Call CloseHandle(proc.hProcess)
ExecCmd = ret
End Function

'Запустить и ждать (с возможностью прерывания)
Public Function ExecWaitCmd(CmdLine As String) As Long
Dim ret As Long
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Start.cb = Len(Start)
ret = CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
Do
  GetExitCodeProcess proc.hProcess, ret
  DoEvents
Loop While ret = STILL_ACTIVE
Call GetExitCodeProcess(proc.hProcess, ret)
Call CloseHandle(proc.hProcess)
ExecWaitCmd = ret
End Function
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList