AGUARDAR EXECUCAO DE OUTRO EXECUTAVEL

USUARIO.EXCLUIDOS 31/05/2007 20:27:13
#219233
como faço para aguardar a execução de outro executavel que eu disparo por dentro do meu sistema?
USUARIO.EXCLUIDOS 01/06/2007 04:33:54
#219265
Não existe ferramnta dentro da linguagem que faça isto pois o VB não é multi-Thread (alguém ja ouviu falar nisto?)

O mais adequado seria que este executável após terminar sua tarefa gravasse uma frag num arquivo .dat, .ini, .txt ou mesmo num BD que fosse sendo monitorado pela sua aplicação; Esta somente continuaria quando esta flag estivesse liberada.

Ps: é necessário colocar um mecanismo de timeout nesta operação para que em caso de falha de alguma espécie não haja travamento do sistema.
USUARIO.EXCLUIDOS 06/06/2007 08:47:03
#219950
Pois entaum fii, resorveu ?
MJAC 02/09/2007 13:32:57
#233754
Desculpe EMERSON_TADEU mas tenho que discordar de você, eu aprendi que em VB se alguém fala que não é possível fazer algo é porque não descobriram como mas impossível não é, até hoje não conheço nenhum tipo de programa para windows que não possa ser feito com VB. (obs no VB6 é possivel gerenciar multi-Thread sim, aqui no site tem dois exemplos postados).

Então sem mais delongas meu amigo KIRSK, vou lhe mostrar como esperar a execução do programa e de quebra poder definir a prioridade de execução (Baixo, Normal, Alto, Crítico) hehe..

Nesse exemplo eu oculto o form e faço a calculadora executar e só quando fechar a calculadora é que eu continua fazendo o form reaparecer e terminar o programa.

Vamos lá primeiro no form adicione um botão e cole esse código:

Private Sub Command1_Click()
Me.Hide
Call RodarEXE("CALC.EXE", 1000, True, Alto, "C:\")
Me.Show
MsgBox "Você fechou o programa agora!!! hehehe..."
End Sub


Depois será preciso adicionar um módulo (AddModule) e colar esse código:

  
Private 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 String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const STILL_ACTIVE = &H103
Enum PRIOR
Baixo = 1
Normal = 2
Alto = 3
Crítico = 4
End Enum
Private 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
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Public Function RodarEXE(Executavel As String, Optional Atualizar As Long = 100, Optional EsperarFinalizacao As Boolean = False, Optional Prioridade As PRIOR = PRIOR.Normal, Optional IniciarEm As String)
Dim tpiProc As PROCESS_INFORMATION
Dim tsiStart As STARTUPINFO
Dim lgRet As Long, TEMP As Long
On Error Resume Next
If Len(IniciarEm) = 0 Then IniciarEm = Mid(Executavel, 1, InStrRev(Executavel, "\"))
tsiStart.cb = Len(tsiStart)
TEMP = 32
Select Case Prioridade
Case Is = PRIOR.Baixo: TEMP = 64
Case Is = PRIOR.Normal: TEMP = 32
Case Is = PRIOR.Alto: TEMP = 128
Case Is = PRIOR.Crítico: TEMP = 256
End Select
lgRet = CreateProcessA(0, Executavel, 0, 0, 1, TEMP, 0, IniciarEm, tsiStart, tpiProc)
If EsperarFinalizacao = False Then Exit Function
Do
DoEvents: Sleep Atualizar
Call GetExitCodeProcess(tpiProc.hProcess, lgRet)
Loop While lgRet = STILL_ACTIVE
Call CloseHandle(tpiProc.hProcess)
End Function



Tenta ai e depois me fala... Abraços
Tópico encerrado , respostas não são mais permitidas