elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problema con función Shell en VB.NET 2010
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con función Shell en VB.NET 2010  (Leído 5,867 veces)
bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Problema con función Shell en VB.NET 2010
« en: 21 Diciembre 2015, 22:16 pm »

Necesito ejecutar una aplicación con la función shell, utilizando el parámetro Wait = True, hacer esto mientras un timer cambia constantemente la propiedad Text del Formulario. El problema es que mientras se espera a que termine dicha aplicación, el timer deja de actualizar la propiedad Text del Formulario.

Aquí les dejo el código de ejemplo para ver si alguien puede ayudarme

Código
  1. Public Class Form1
  2.    Dim WithEvents tmrEfect As New Timer With {.Enabled = True, .Interval = 1000}
  3.  
  4.    Private Sub tmrEfect_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrEfect.Tick
  5.        Me.Text = Now
  6.    End Sub
  7.  
  8.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  9.        Shell("calc.exe", AppWinStyle.NormalFocus, True)
  10.        MsgBox("cerrada la aplicación")
  11.    End Sub
  12. End Class


« Última modificación: 22 Diciembre 2015, 02:05 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #1 en: 22 Diciembre 2015, 02:05 am »

Buenas!

1. Por favor, postea las preguntas de Vb.Net en la sección correcta. (hay muchos posts movidos que deberían haberte dado ya una pista...)

2. Debes utilizar las etiquetas Geshi para insertar código, lee las reglas del foro de programación general, gracias.



Es normal lo que te ocurre, ya que cuando activas el parámetro "wait", el hilo propietario desde el que has realizado la llamada se detiene por tiempo indefinido hasta que el proceso finalize su ejecución.

Para solucionar el problema que has descrito se me ocurren al menos dos maneras distintas,
pero antes de nada por cuestiones de productividad, rendimiento, y adquisición de buenas costumbres, te aconsejo parar ahora mismo de utilizar la función Microsoft.VisualBasic.Shell y cualquier otro miembro de ese espacio de nombres; reemplazalo por el uso de la Class System.Diagnostics.Process.

1. Puedes iniciar el proceso de la siguiente manera:
Código
  1. Threading.Tasks.Task.Factory.StartNew(
  2.    Sub()
  3.        Using p As New Process
  4.            p.StartInfo.FileName = "calc.exe"
  5.            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  6.            p.Start()
  7.            p.WaitForExit()
  8.        End Using
  9.  
  10.        MessageBox.Show("cerrada la aplicación", "Calc.exe",
  11.                        MessageBoxButtons.OK, MessageBoxIcon.Information)
  12.  
  13.    End Sub, TaskCreationOptions.None)

Nota:
En otras circunstancias tal vez podrias preferir utilizar el flag TaskCreationOptions.LongRunning para forzar la creación de un nuevo hilo en el grupo de hilos por defecto, ganando así más velocidad de inicialización de la tarea al no esperar en la cola de hilos.

2. O puedes suscribirte al evento Process.Exited:
Código
  1. Friend WithEvents Calc As Process
  2.  
  3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.  
  5.    Calc = New Process
  6.    Calc.EnableRaisingEvents = True
  7.    Calc.StartInfo.FileName = "calc.exe"
  8.    Calc.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  9.    Calc.Start()
  10.  
  11. End Sub
  12.  
  13. Private Sub Calc_Exited() Handles Calc.Exited
  14.  
  15.    MessageBox.Show("cerrada la aplicación", "Calc.exe",
  16.                            MessageBoxButtons.OK, MessageBoxIcon.Information)
  17.  
  18.    ' Seguir con la lógica aquí...
  19.  
  20. End Sub

Saludos


« Última modificación: 22 Diciembre 2015, 04:00 am por Eleкtro » En línea



bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #2 en: 22 Diciembre 2015, 17:08 pm »

Muchas Gracias, Muy buena la ayuda una explicación de libro.

Buenas!

1. Por favor, postea las preguntas de Vb.Net en la sección correcta. (hay muchos posts movidos que deberían haberte dado ya una pista...)

2. Debes utilizar las etiquetas Geshi para insertar código, lee las reglas del foro de programación general, gracias.



Es normal lo que te ocurre, ya que cuando activas el parámetro "wait", el hilo propietario desde el que has realizado la llamada se detiene por tiempo indefinido hasta que el proceso finalize su ejecución.

Para solucionar el problema que has descrito se me ocurren al menos dos maneras distintas,
pero antes de nada por cuestiones de productividad, rendimiento, y adquisición de buenas costumbres, te aconsejo parar ahora mismo de utilizar la función Microsoft.VisualBasic.Shell y cualquier otro miembro de ese espacio de nombres; reemplazalo por el uso de la Class System.Diagnostics.Process.

1. Puedes iniciar el proceso de la siguiente manera:
Código
  1. Threading.Tasks.Task.Factory.StartNew(
  2.    Sub()
  3.        Using p As New Process
  4.            p.StartInfo.FileName = "calc.exe"
  5.            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  6.            p.Start()
  7.            p.WaitForExit()
  8.        End Using
  9.  
  10.        MessageBox.Show("cerrada la aplicación", "Calc.exe",
  11.                        MessageBoxButtons.OK, MessageBoxIcon.Information)
  12.  
  13.    End Sub, TaskCreationOptions.None)

Nota:
En otras circunstancias tal vez podrias preferir utilizar el flag TaskCreationOptions.LongRunning para forzar la creación de un nuevo hilo en el grupo de hilos por defecto, ganando así más velocidad de inicialización de la tarea al no esperar en la cola de hilos.

2. O puedes suscribirte al evento Process.Exited:
Código
  1. Friend WithEvents Calc As Process
  2.  
  3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.  
  5.    Calc = New Process
  6.    Calc.EnableRaisingEvents = True
  7.    Calc.StartInfo.FileName = "calc.exe"
  8.    Calc.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  9.    Calc.Start()
  10.  
  11. End Sub
  12.  
  13. Private Sub Calc_Exited() Handles Calc.Exited
  14.  
  15.    MessageBox.Show("cerrada la aplicación", "Calc.exe",
  16.                            MessageBoxButtons.OK, MessageBoxIcon.Information)
  17.  
  18.    ' Seguir con la lógica aquí...
  19.  
  20. End Sub

Saludos
En línea

bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #3 en: 26 Diciembre 2015, 02:19 am »

Siento tener que revivir este tema, pero la verdad es que a pesar de que el código funciona perfectamente, no he podido adaptarlo a lo que necesito, discúlpenme.

Anteriormente en VB6 yo usaba una función para ejecutar aplicaciones y esperar a que estas se cerrasen para continuar ejecutando el código de mi programa, sin que esto detuviera los timers que yo usaba en mi proyecto.

Ahora en VB.NET como adapto este código para poder usarlo varías veces seguidas dentro de un mismo evento.

Ejemplo:

Código
  1. Imports System.Threading.Tasks
  2.  
  3. Public Class Form1
  4.  
  5.    Dim WithEvents tmrEfect As New Timer With {.Enabled = True, .Interval = 1000}
  6.  
  7.    Private Sub tmrEfect_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrEfect.Tick
  8.        Me.Text = Now
  9.    End Sub
  10.  
  11.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  12.        RunWait("calc.exe", ProcessWindowStyle.Normal)
  13.        'Aquí necesito poner varias líneas de código de tienen que ejecutarse al cerrarce la calculadora
  14.        MsgBox("aplicación calc.exe cerrada")
  15.  
  16.        RunWait("mspaint.exe", ProcessWindowStyle.Normal)
  17.        'Aquí necesito poner varias líneas de código de tienen que ejecutarse al cerrarce el paint
  18.        MsgBox("aplicación mspaint.exe cerrada")
  19.    End Sub
  20.  
  21.    Private Sub RunWait(ByVal FullPathFile As String, ByVal WindowStyle As ProcessWindowStyle)
  22.        Threading.Tasks.Task.Factory.StartNew(
  23.            Sub()
  24.                Using p As New Process
  25.                    p.StartInfo.FileName = FullPathFile
  26.                    p.StartInfo.WindowStyle = WindowStyle
  27.                    p.Start()
  28.                    p.WaitForExit()
  29.                End Using
  30.            End Sub, TaskCreationOptions.None)
  31.    End Sub
  32. End Class
« Última modificación: 26 Diciembre 2015, 03:13 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #4 en: 26 Diciembre 2015, 03:24 am »

2. Debes utilizar las etiquetas Geshi para insertar código, lee las reglas del foro de programación general, gracias.

Si el próximo mensaje con código incumple la regla que ya conoces, será eliminado :-\ lo siento.



Puedes "concatenar" la tarea con otra tarea de continuación asíncrona, utilizando la función ContinueWith
Código
  1. Task.Factory.StartNew(
  2.    Sub()
  3.        Using p As New Process
  4.            p.StartInfo.FileName = "calc.exe"
  5.            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  6.            p.Start()
  7.            p.WaitForExit()
  8.        End Using
  9.    End Sub, TaskCreationOptions.None).ContinueWith(
  10.    Sub()
  11.        MessageBox.Show("calc.exe has exited.")
  12.    End Sub)

O simplemente esperar a que finalice la tarea:
Código
  1. Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task
  2.  
  3.    Dim processTask As Action =
  4.        Sub()
  5.            Using p As New Process
  6.                p.StartInfo.FileName = fullPathFile
  7.                p.StartInfo.WindowStyle = windowStyle
  8.                p.Start()
  9.                p.WaitForExit()
  10.            End Using
  11.        End Sub
  12.  
  13.    Return New Task(processTask)
  14.  
  15. End Function
...
Código
  1. Sub Test()... Handles...
  2.  
  3.    Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
  4.    t.Start()
  5.    t.Wait()
  6.  
  7.    MessageBox.Show("calc.exe has exited.")
  8.  
  9. End Sub

PD: La primera solución tiene la ventaja de no bloquear el thread propietario de la llamada a esa Task.

Saludos
« Última modificación: 26 Diciembre 2015, 03:30 am por Eleкtro » En línea



bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #5 en: 2 Enero 2016, 20:30 pm »

Eso es exactamente lo que necesito, sólo queda un pequeño detalle, que para mi es el más problemático y para que puedan ayudarme, voy a tratar de explicar mejor lo que quiero hacer.

El programa ejecuta varias aplicaciones a lo largo de un procedimiento y es espera a que terminen cada una de ellas para poder continuar con el resto del código. Hasta aquí vamos bien con lo logrado hasta ahora, el problema es que mientras se espera a que las aplicaciones terminen un timer tiene que ir haciendo cambios en el formulario, como uso en el ejemplo cambiar el texto del titulo del form, pero puede ser cualquier otra cosa para indicar que el programa está funcionando, como pudiera ser también cambiar la imagen de un picturebox para mostrar una secuencia de imágenes de un reloj de arena.

Por ejemplo:

Código
  1. Imports System.Threading.Tasks
  2.  
  3. Public Class Form1
  4.    Dim WithEvents tmrEfect As New Timer With {.Enabled = True, .Interval = 1000}
  5.  
  6.    Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task
  7.  
  8.        Dim processTask As Action =
  9.            Sub()
  10.                Using p As New Process
  11.                    p.StartInfo.FileName = fullPathFile
  12.                    p.StartInfo.WindowStyle = windowStyle
  13.                    p.Start()
  14.                    p.WaitForExit()
  15.                End Using
  16.            End Sub
  17.  
  18.        Return New Task(processTask)
  19.  
  20.    End Function
  21.  
  22.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  23.        Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
  24.        t.Start()
  25.        t.Wait()
  26.        MessageBox.Show("calc.exe has exited.")
  27.  
  28.        t = RunWait("mspaint.exe", ProcessWindowStyle.Normal)
  29.        t.Start()
  30.        t.Wait()
  31.        MessageBox.Show("mspaint.exe has exited.")
  32.    End Sub
  33.  
  34.    Private Sub tmrEfect_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrEfect.Tick
  35.        Me.Text &= "."
  36.        If Len(Me.Text) = 10 Then Me.Text = "Espere"
  37.    End Sub
  38.  
  39.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  40.        Me.Text = "Espere"
  41.    End Sub
  42. End Class
  43.  

PD: Disculpen por la demora en responder.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #6 en: 2 Enero 2016, 22:13 pm »

Código
  1. Private ReadOnly title As String = "Espere"
  2. Friend WithEvents TimerEfect As Global.System.Windows.Forms.Timer
  3.  
  4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  5.  
  6.    Me.Text = Me.title
  7.    Me.TimerEfect = New Global.System.Windows.Forms.Timer With {.Enabled = True, .Interval = 1000}
  8.  
  9. End Sub
  10.  
  11. Private Sub TimerEfect_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles TimerEfect.Tick
  12.  
  13.    If Me.Text.EndsWith("...") Then
  14.        Me.Text = Me.title
  15.  
  16.    Else
  17.        Me.Text &= "."
  18.  
  19.    End If
  20.  
  21. End Sub
  22.  
  23. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  24.  
  25.    Task.Factory.StartNew(
  26.        Sub()
  27.            Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
  28.            t.Start()
  29.            t.Wait()
  30.            MessageBox.Show("calc.exe has exited.")
  31.  
  32.            t = RunWait("mspaint.exe", ProcessWindowStyle.Normal)
  33.            t.Start()
  34.            t.Wait()
  35.            MessageBox.Show("mspaint.exe has exited.")
  36.        End Sub)
  37.  
  38. End Sub
  39.  
  40. Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task
  41.  
  42.    Dim processTask As Action =
  43.        Sub()
  44.            Using p As New Process
  45.                p.StartInfo.FileName = fullPathFile
  46.                p.StartInfo.WindowStyle = windowStyle
  47.                p.Start()
  48.                p.WaitForExit()
  49.            End Using
  50.        End Sub
  51.  
  52.    Return New Task(processTask)
  53.  
  54. End Function

Saludos
En línea



bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Problema con función Shell en VB.NET 2010
« Respuesta #7 en: 3 Enero 2016, 02:14 am »

Ahora si quedó perfecto.

Muchas gracias por la ayuda y por aguantar tantas molestias

Código
  1. Private ReadOnly title As String = "Espere"
  2. Friend WithEvents TimerEfect As Global.System.Windows.Forms.Timer
  3.  
  4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  5.  
  6.    Me.Text = Me.title
  7.    Me.TimerEfect = New Global.System.Windows.Forms.Timer With {.Enabled = True, .Interval = 1000}
  8.  
  9. End Sub
  10.  
  11. Private Sub TimerEfect_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles TimerEfect.Tick
  12.  
  13.    If Me.Text.EndsWith("...") Then
  14.        Me.Text = Me.title
  15.  
  16.    Else
  17.        Me.Text &= "."
  18.  
  19.    End If
  20.  
  21. End Sub
  22.  
  23. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  24.  
  25.    Task.Factory.StartNew(
  26.        Sub()
  27.            Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
  28.            t.Start()
  29.            t.Wait()
  30.            MessageBox.Show("calc.exe has exited.")
  31.  
  32.            t = RunWait("mspaint.exe", ProcessWindowStyle.Normal)
  33.            t.Start()
  34.            t.Wait()
  35.            MessageBox.Show("mspaint.exe has exited.")
  36.        End Sub)
  37.  
  38. End Sub
  39.  
  40. Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task
  41.  
  42.    Dim processTask As Action =
  43.        Sub()
  44.            Using p As New Process
  45.                p.StartInfo.FileName = fullPathFile
  46.                p.StartInfo.WindowStyle = windowStyle
  47.                p.Start()
  48.                p.WaitForExit()
  49.            End Using
  50.        End Sub
  51.  
  52.    Return New Task(processTask)
  53.  
  54. End Function

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con Shell
Programación Visual Basic
ezdookie 6 2,342 Último mensaje 6 Enero 2006, 23:46 pm
por Gangrel
Problema con una shell C99 « 1 2 »
Nivel Web
djcanuto 14 9,451 Último mensaje 25 Junio 2010, 16:18 pm
por Debci
Llamar a función de Shell Extension Context Menu Handler.
Programación C/C++
APOKLIPTICO 5 10,815 Último mensaje 20 Diciembre 2011, 16:06 pm
por Eternal Idol
llamar funcion equivalente a shell desde window mobile
.NET (C#, VB.NET, ASP)
sysfactory 1 2,371 Último mensaje 18 Julio 2013, 06:14 am
por Eleкtro
MOVIDO: Problema con función Shell en VB.NET 2010
Programación Visual Basic
Eleкtro 0 1,506 Último mensaje 22 Diciembre 2015, 02:06 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines