• Viernes 8 de Noviembre de 2024, 21:35

Autor Tema:  Procesos Paralelos  (Leído 4264 veces)

Jose Arriagada

  • Miembro MUY activo
  • ***
  • Mensajes: 373
    • Ver Perfil
Procesos Paralelos
« en: Miércoles 5 de Enero de 2005, 14:05 »
0
Amigos:

Tengo el siguiente problema:

En un command1, tengo instrucciones que realizan algunos procesos sobre tablas y calculos varios.
Esto se demora su tiempo.

Para aprovechar esto, quiere tener la posibilidad de poder presionar otro command2 que realice otro tipo de acciones.

Es posible?

Ya que al presionar el command1, no puedo hacer nada hasta que el proceso termine.

Existe alguna forma?

Podrian decirme como, o indicarme donde encontrar algun codigo de ejemplo.

Gracias

martin campos quintero

  • Miembro MUY activo
  • ***
  • Mensajes: 113
  • Nacionalidad: 00
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #1 en: Jueves 6 de Enero de 2005, 06:30 »
0
Me imagino que para sucederte eso al presionar el command1 lo que tienes dentro de el es un ciclo.

Bien pues lo que yo hago para hacer varias acciones es, pues simular el ciclo en un timer y asi podrias presionar el command2 para que haga sus instrucciones tambien.

O sea el chiste de todo es simular lo que hace el ciclo, pero con un timer.

Espero te sirva de algo esta opinion  ;)

desarrollo

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #2 en: Jueves 6 de Enero de 2005, 20:33 »
0
hola Zerocool  :hola:

a mi tambien me interesa como determinar dentro de un timer hacer dos o mas procesos que contengan ciclos cada uno, osea de que manera lo planteas  :(

gracias por tus comentarios

desarrollo   :comp:

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #3 en: Viernes 7 de Enero de 2005, 18:26 »
0
Hola Jose, mira si lo que estas haciendo es un ciclo, puedes utilizar la funcion DoEvents, dentro del ciclo y con eso mientras esta realizandose el bucle, puedes oprimir el boton que quieras y hara el otro proceso y luego continuara con el ciclo ;) checalo te lo recomiendo :kicking:  :D bye

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #4 en: Sábado 8 de Enero de 2005, 05:18 »
0
Hola Jose perdona mi torpeza  :P  :kicking: por no dejarte ejemplos, pero te hice uno sencillito para ver si eso es lo que deseas :), mira este y pruebalo:

Private Sub Command1_Click()
For a = 1 To 100000
    DoEvents                      'linea que te decia
    List1.AddItem a
Next
End Sub

Private Sub Command2_Click()
msgbox "hola"
End Sub

mira este ejemplo consisten dos comands button y un list, el list es para hacer un conteo de 100000 numeros, eso tardara un poco, pero ponle que quieres hacer otra cosas mientras esta el conteo pues con el doevents puedes mandar el control a otras cosas y seguir otro proceso, ahora si espero que te haya quedado bien ;) bueno ahi nos vermox, cuidense, bye   :hola: :kicking:

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #5 en: Martes 11 de Enero de 2005, 16:05 »
0
Hola.

Crea otro ejecutable distinto, un subprograma, vamos, que realice esa labor que tarda tanto. Llámalo desde la aplicación principal de una forma similar a esta:

Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private Const STILL_ACTIVE = &H103
  5. Private Const PROCESS_QUERY_INFORMATION = &H400
  6.  
  7. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
  8.  
  9. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  10.  
  11. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  12.  
  13. Private Sub ExecProceso(Byval ExeFileName As String)
  14.  
  15.     On Error GoTo Err_Exec
  16.    
  17.     Dim lPId As Long, lRc As Long
  18.     lPId = OpenProcess(PROCESS_QUERY_INFORMATION _
  19.     , False, Shell(ExeFileName, vbNormalFocus))
  20.     Do
  21.         GetExitCodeProcess lPId, lRc
  22.         Sleep 100
  23.         DoEvents
  24.     Loop While lRc = STILL_ACTIVE
  25.    
  26.     MsgBox "Proceso finalizado"
  27.    
  28.     Exit Sub
  29.    
  30. Err_Exec:
  31.     MsgBox "Fallo sometiendo proceso '" & ExeFile & "'." & String(2, vbCrLf) _
  32.     & "(" & Err.Number & ") " & Err.Description, vbCritical, "Ejecutar"
  33.  
  34. End Sub
  35.  
  36.  

Abur.

jhonilson

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #6 en: Martes 11 de Enero de 2005, 17:01 »
0
Pues la manera mas sencilla de hacer lo que quieres es asi:

 sub command1_click()
     call command2_click()
ens sub

Con esto al presionar el boton 1 haces que se presione el 2. :hola:

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #7 en: Martes 11 de Enero de 2005, 17:40 »
0
Tronco, pero ¿has leido aunque sea por encima lo que necesita José...?

jhonilson

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #8 en: Miércoles 12 de Enero de 2005, 20:57 »
0
Si en las operaciones incluidas en el command2 no hay variables que esten siendo utilizadas por el command1 no deberia de tener problemas.

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #9 en: Miércoles 12 de Enero de 2005, 21:14 »
0
Mira jhonilson a lo que se refiere el es a hacer dos cosas a la vez, en su caso es que mientras este haciendo un proceso largo pueda realizar otro, lee un poquito los mensajes plz, para que asi tus respuestas sirvan  ;)  :D

Jose Arriagada

  • Miembro MUY activo
  • ***
  • Mensajes: 373
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #10 en: Miércoles 12 de Enero de 2005, 22:26 »
0
Gracias por las todas las respuestas y dedicacion a estas.

Probando con el DoEvents, encontre una falla.

Si utilizan el siguiente codigo:

Private Sub Command1_Click()
Command1.Tag = 1
For a = 1 To 10000
    DoEvents 'linea que te decia
    List1.AddItem Format(Time, "hh:mm:ss")
    If CDbl(Command1.Tag) = 0 Then
        Exit For
    End If
Next
End Sub

Private Sub Command2_Click()
MsgBox "hola"
End Sub

Private Sub Command3_Click()
Command1.Tag = 0
End Sub

Private Sub Form_Load()
Command1.Tag = 1
End Sub


Se daran cuenta que:
- Al presionar command1, se ejecuta la insercion de registros con la hora en list
- Al presionar command2, se muestra un mensaje, hasta aqui, todo ok.
- Pero si al presionar command2, esperamos unos segundos (10 aprox) y presionamos "Aceptar", el proceso que estaba haciendo command1, continua.
  Y podran darse cuenta, que mientras se estaba esperando que se presione "Aceptar", el proceso command1 se detiene, y ellos simplemente revisando los registros de tiempo que se insertaron en el list, veran que existe en alguna parte entre un registro y otro un periodo de 10 seg aprox, y esto es producto de que estaba esperando "Aceptar"

La respuesta esta cerca, pero aun no he podido realizar procesos paralelos.

Gracias.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Procesos Paralelos
« Respuesta #11 en: Jueves 13 de Enero de 2005, 09:16 »
0
Hola José.

Es normal que esto que comentas ocurra. Hay una sola hebra para realizar las acciones del bucle en command1 y el resto de eventos que generes, y mientras se hace una cosa, no se hace la otra.

Crea otro ejecutable que realice las acciones de command1, al usar shell en OpenProcess estarás usando una nueva hebra del procesador. Esto lo he utilizado en varios proyectos (casi siempre con procesos que copian gran cantidad de archivos, importan datos y cosas por el estilo) y funciona sin mayor problema.

Con lo que sí que te puedes encontrar es que te tengas que plantear el diseño de la aplicación de otra forma (así por las buenas no podrías mostrar los resultados de la ejecución del subproceso en un form del programa principal... tendrías que pensar en arreglar la situación mediante paso de parámetros, punteros, etc.).
A lo mejor realizar estos cambios te supone dar la vuelta a media aplicación y no estás dispuesto, pero vb cojea de las dos piernas en lo que se refiere a uso de threads.

Chao.