Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Abril 16, 2011, 11:11:02 pm
-
Hola a todos. (Nota: parece una pregunta sobre base de datos, pero no lo es, es sobre la funcion Shell)
Tengo una inquietud. Estoy haciendo un sencillo programita para hacer respaldo y restauracion de una base de datos (Firebird).
Comentario: Para el uso adecuado de respaldo y restauración de una BD Firebird a de usar el programa GBak que viene en la instalacion de Firebird. Este comando o programa permite hacer sin problemas el respaldo en caliente.
Y basta con solo crear dos botones, uno para hacer el respaldo y el otro para recuperar la bd a partir del archivo backup.
Hice esto:
En el boton Respaldo
Dim RetVal
RetVal = Shell("c:\Archivos de Programa\Firebird\Firebird_2_1\BIN\gbak -v -t -user YVANB -password miclave c:\0006.fdb c:\0006.fbk", 0)
y en el boton Restauracion:
Dim RetVal
RetVal = Shell("c:\Archivos de Programa\Firebird\Firebird_2_1\BIN\gbak -c -v -user YVANB -password miclave c:\0006.fbk c:\0006.fdb", 0)
Luego le pongo adornos. Mi duda viene aqui. Cuando mando la orden no me entero el "tiempo" que tarda en crearse o restaurarse el archivo, es decir, cuando entro a la linea RetVal = Shell.... pasa inmediatamente a la siguiente linea y RetVal ya tiene un valor que me indica que si se ejecuto GBak pero cuando veo a la par el explorador de windows el archivo se ha creado un tiempillo después, es decir, GBak se tomo un tiempito en crear el archivo y mi aplicación no se entero.
¿Hay alguna forma de saber que se completo la ejecucion del programa invocado con el Shell en VB6?
La verdad que con solo el Shell yo creo que no, solo se me ocurre hacer un artificio (como siempre).
Poner un timer y preguntar por cada ciclo si ya existe el archivo para que pueda mandar un mensaje al usuario de que el proceso se completo, mientras tanto le pondre un relojito de arena o un progressbar o un cartel de "Esperate".
Hago esto porque hay cada usuario!!!, de pronto manda la orden de backup y si se tratara de una BD de 400 megas va a tardar un tiempo en crearse el archivo y el atolondrado puede apagar la PC.
Tampoco me sirve mucho poner el valor del Shell de 0 a 1 (final del shell) porque no quiero marear al usuario con una ventana DOS.
Que opinan de la idea del timer??? o si tuvieran alguna otra mejor idea lo agradecería mucho me lo indiquen.
Abrazos
-
Puedes consultar cada 5 segundos si el gbak.exe esta ejecutandose.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/60.htm (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/60.htm)
Tambien puede probar este ejemplo que esta bastante bueno y si recuerdo bien creo que no utiliza timer.
http://www.leandroascierto.com.ar/foro/index.php?topic=547.0 (http://www.leandroascierto.com.ar/foro/index.php?topic=547.0)
-
Bien gracias, creo que eso me servirá. Saludos
-
hola otra forma más
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitMessage Lib "user32.dll" () As Long
Private Const WAIT_TIMEOUT As Long = &H102
Private Const SYNCHRONIZE As Long = &H100000
Private Function ShellAndWait(ByVal ProcessName As String, Optional ByVal WindowStyle As VbAppWinStyle = vbNormalFocus, Optional ByVal bDoEvents As Boolean)
On Error GoTo ShellError
Dim lPID As Long
Dim hProcess As Long
lPID = Shell(ProcessName, WindowStyle)
hProcess = OpenProcess(SYNCHRONIZE, 0, lPID)
If hProcess <> 0 Then
Do While WaitForSingleObject(hProcess, 250) = WAIT_TIMEOUT
If bDoEvents Then
DoEvents
WaitMessage
End If
Loop
CloseHandle hProcess
ShellAndWait = True
End If
ShellError:
End Function
-
Excelente Leandro, gracias. Esta forma me parece mas adecuada.
Saludos
-
Excelente FRASE "el atolondrado puede apagar la PC"
Podrias poner el codigo para ver como te ha quedado
Gracias