Título: Necesito parar un proceso de MSDOS en cuanto pulso una tecla Publicado por: antecessor en 7 Marzo 2015, 17:45 pm Hola.
Tengo una applicación en Visual Basic 6. El objetivo es escanear una carpeta y determinar qué archivos son copias imagen de ghost, esto es, tienen extensión *.GHO. Una vez localizados, pulso el botón test que arranca la aplicación de MSDOS ghost32.exe. Esta aplicación chequea cada copia imagen para verificar si es correcta. Todo funciona bien. El problema viene cuando quiero parar la comprobación de las imágenes porque le va a costar mucho y necesito el ordenador para otra cosa, pues bien, no hay manera. Lo único que consigo es, manteniendo la tecla que yo determine pulsada, y cuando está a punto de terminar la comprobación que está haciendo de la copia imagen actual y va a comenzar la próxima comprobación, se pare el programa, y lo que yo quiero es que se pare, o me pregunte si quiero continuar o estoy seguro de parar en cuanto yo le pulse una tecla, por ejemplo ESC. Yo no tengo demasiada idea de Visual Basic y las partes de programa más complicadas las he cogido de código que he encontrado por ahí y adaptado a mi aplicación: Resumiendo: necesito parar el proceso de MSDOS -ghost32.exe- mientras se esté realizando la comprobación y pulsando una vez la tecla ESC, y que me pregunte si quiero continuar o realmente parar -salir del bucle FOR o reiniciar el programa-. ------------------------------------------------------------------------- Private Sub Form_Load() ' intervalo para el timer para la detección de tecla Timer1.Interval = 50 End Sub ---------------------------------------------------------------------------- Private Sub Timer1_Timer() If GetKeyState(vbKeyEscape) < 0 Then parar = 1 ' Detecto si se ha pulsado la tecla ESCAPE End Sub ---------------------------------------------------------------------------- Private Sub cmdTest_Click() 'Botón que al pulsarlo hará que se empiecen a comprobar las copias imagen DoEvents 'Éste es fundamental, no quitar lblCopiasRestantes.Visible = True lblQuedan.Visible = True lblQuedan = lblCount RutaArchivo = GHO(n) 'La referencia a Windows Script Host Object Model errorimagen = "" a = 0 i = 1 Restantes = narchivos For n = 0 To narchivos - 1 DoEvents Restantes = narchivos - n lblQuedan.Caption = Restantes - 1 temporal = RutaCorta(lstFoundFiles.List(n)) 'Comando = "ghost32.exe -batch -chkimg," & lstFoundFiles.List(n) 'Arranca el ghost configurado para chequear imágenes" Comando = "ghost32.exe -batch -chkimg," & temporal 'lstFoundFiles.List(n) Arranca el ghost configurado para chequear imágenes" 'En lstFoundFiles está la lista de archivos *.GHO encontrados con ruta completa errorimagen = ejecutar_Dos(Comando) 'Si la imagen es incorrecta devuelve un error 'llamo a la función If parar = 1 Then Exit For 'Si hemos pulsado la tecla ESC "cero" salimos del bucle If errorimagen <> "" Then 'Si ghost devuelve un error If i = 1 Then txtResultado.Text = " Las siguientes copias imagen no son correctas" + Chr$(13) + Chr$(10) i = i + 1 a = a + 1 txtResultado.Text = txtResultado.Text + Chr$(13) + Chr$(10) 'Línea en blanco txtResultado.Text = txtResultado.Text + " Error " & i - 1 & " : " + lstFoundFiles.List(n) + Chr$(13) + Chr$(10) End If Next n If a = 0 Then txtResultado.Text = " Todas las copias imagen son correctas:" + Chr$(13) + Chr$(10) CmdLimpiarTexto.Visible = True cmdImprimir.Visible = True End Sub ---------------------------------------------------------------------------------------------------------------------------------- Function ejecutar_Dos(Comando As String) As String 'Función para ejecutar ghost32.exe Dim oShell As WshShell Dim oExec As WshExec Dim ret As String Set oShell = New WshShell ' ejecutar el comando Set oExec = oShell.Exec("%comspec% /c " & Comando) ret = oExec.StdOut.ReadAll() ' retornar la salida y devolverla a la función ejecutar_Dos = ret ' Replace(ret, Chr(10), vbNewLine) DoEvents Me.SetFocus End Function Agredecería alguna ayuda al respecto. Sasludos. Título: Re: Necesito parar un proceso de MSDOS en cuanto pulso una tecla Publicado por: okik en 11 Marzo 2015, 17:25 pm Hola
A mi me pasó lo mismo hace tiempo... Este código es una plantilla, un ejemplo. Analízalo (es muy sencillo) y lo aplicas a tu código. Necisitas un PictureBox, un CommandButton y un control Timer. Lo que hace es emular un proceso sin fin o muy largo For/next o Do Loop. Si se pulsa escape en el evento Timer detecta la tecla ESC y le da valor Verdadero a una variable que he llamado PauseProc. Al ser verdadera en el proceso ejecuta una procedimiento llamado Esperar que emula un reloj en segundos (sin timer), y el proceso se pausa. Si se vuelve a pulsar el CommandButton continúa el proceso, que no estaba parado, si no pausado por el proceso Espera. Entonces el Timer continua (para detectar la tecla ESC) y para el proceso Espera y entonces Tu proceso continua. Puedes crear si quieres una variable StopProc como boleano y si es Verdadero paras el proceso definitvamente. Espero que te sirva: Código
Esto es una forma muy rebuscada. Pero si quieres en lugar de usar For/next o Do /Loop metes el proceso en el un Timer y cuando te interese lo estableces a False y cuando quieras reaundar a True. Es más sencillo. |