[Python-es] Necesito ayuda con hilos o algún método para que no salga el mensaje: La aplicación no responde.

Héctor J. Benítez Corredera facturasxebolax en gmail.com
Jue Mar 14 16:45:55 EDT 2019


Hola muchas gracias por vuestras respuestas.

Bien al final me funciono lanzar el hilo y dejar al usuario en una 
consola de resultados que tiene la aplicación:

Llamo al hilo:

def OnMenuwipesystem(self,event):

t = hilo_wipesystem()

t.start()

Bien la verdad que el hilo no necesito tener mucho control sobre el, 
salvo stdout y stderr junto si se proceso bien o no. Esto me funciona 
perfectamente:

class hilo_wipesystem(threading.Thread):

def __init__(self):

self.stdout = ""

self.stderr = ""

threading.Thread.__init__(self)

def run(self):

msg = wx.MessageDialog(None, "Esta apunto de borrar la partición SYSTEM. 
Esto no es reversible. \n¿Esta seguro de que desea continuar?", 
'Pregunta', wx.YES_NO | wx.ICON_QUESTION)

ret = msg.ShowModal()

if ret == wx.ID_YES:

msg.Destroy

result = Result()

print(time.strftime("%H:%M:%S") + " *** Inicio WIPE SYSTEM ***\n")

play_sound()

os.chdir(directorio + "/zbin")

comando = "adb shell twrp wipe system"

p = Popen(comando, stdin=PIPE, stdout=PIPE, stderr=PIPE, 
encoding='utf8', startupinfo=si)

(stdout, stderr) = p.communicate()

result.exit_code = p.returncode

result.stdout = stdout

result.stderr = stderr

result.command = comando

result.convert1 = stdout.replace("\n\n", "")

result.convert2 = stderr.replace("\n\n", "")

if p.returncode != 0:

stop_sound()

dlg = wx.MessageDialog(None, "El proceso a fallado, no se ha podido 
hacer WIPE SYSTEM.\n Asegúrese de estar en modo Recovery para hacer este 
proceso.\n Revise el Log en la pantalla principal para saber el 
resultado.", "Error", wx.OK | wx.ICON_ERROR)

dlg.ShowModal()

dlg.Destroy()

print(result.convert1)

print(result.convert2)

print(time.strftime("%H:%M:%S") + " *** Fin WIPE SYSTEM ***\n")

r1 = borraradbmem()

r1.start()

else:

stop_sound()

dlg = wx.MessageDialog(None, "Se realizo correctamente WIPE SYSTEM.\n No 
obstante revise el Log en la ventana principal.", "Información", wx.OK | 
wx.ICON_INFORMATION)

dlg.ShowModal()

dlg.Destroy()

print(result.convert1)

print(result.convert2)

print(time.strftime("%H:%M:%S") + " *** Fin WIPE SYSTEM ***\n")

r1 = borraradbmem()

r1.start()

return result

else:

msg.Destroy

Muchas gracias por las respuestas y no obstante al estar aprendiendo son 
muy valiosas para mi ya que las guardo y estudiare.

Cordiales saludos

El 14/03/2019 a las 21:33, Hiko hitokiri escribió:
> Hola, pues yo te doy una forma de usar lo del hilo, si te funciona 
> bien con popen o con os eso ya es de que tu hagas tus pruebas, usando 
> la libreria nativa de python
>
> class KeepAliveClass(threading.Thread): """Use to calculate the time 
> that websocket is out """ def __init__(self): 
> threading.Thread.__init__(self) passdef start(self, **kwargs): 
> self.objectSoap = kwargs["objetoSoap"]def stop(self): self.stoped = 
> True def run(self): while True: self.metodo(self.dm_id, 
> self.client_ip) print("KeepAlive4") if self.stoped: break 
> time.sleep(120) print("close")
> self.objKeepAlive.start(**data_keep_alive)
>
> El jue., 14 mar. 2019 a las 12:02, Alberto Curro 
> (<bertothunder en gmail.com <mailto:bertothunder en gmail.com>>) escribió:
>
>     Buenas,
>
>       Deberías leerte de nuevo la respuesta del compañero Angel,
>     porque te ha dado casi la solución completa.
>
>       No debes usar hilos con popen, tendrás errores. El propio módulo
>     subprocess, como te recomienda Angel, te dará la funcionalidad que
>     necesitas.
>
>      Saludos
>
>
>     El sáb., 2 mar. 2019 a las 1:15, Héctor J. Benítez Corredera
>     (<facturasxebolax en gmail.com <mailto:facturasxebolax en gmail.com>>)
>     escribió:
>
>         Hola gracias por tu respuesta. Bien e estado probando pero
>         realmente mi problema es cuando se lanza popen ejecutando la
>         aplicación externa.
>
>         Bien en ese momento popen al ejecutar la aplicación bloquea la
>         GUI dando el mensaje la aplicación no responde.
>
>         Bien hasta que no termina de ejecutar la aplicación externa no
>         vuelvo a tener control del GUI.
>
>         Pretendo poner una ventana con el titulo Espere por favor y
>         que se ejecute detrás de ella la aplicación, lo que quiero
>         evitar es el mensaje de la aplicación no responde ya que puede
>         dar a malentendidos y el usuario puede cerrarla, eso puede ser
>         peligroso en la clase de aplicación que estoy haciendo ya que
>         se trata de modificaciones a móviles Android y interrumpir la
>         acción a lo bruto sin que termine puede ser perjudicial.
>
>         Yo se que la aplicación esta funcionando y que si existe algún
>         fallo esta controlado con la salida del returncode , pero un
>         usuario el encontrarse el mensaje la aplicación no responde
>         puede no querer esperar a su finalización y al ser alguna de
>         las tareas que hace de varios minutos como mencione puede ser
>         peligroso.
>
>         Por eso lo de los Threads para ejecutar la aplicación sin que
>         bloquee la ventana de espera.
>
>         No se si me e explicado correctamente.
>
>         No obstante sigo buscando.
>
>         Agradecido de nuevo.
>
>         Cordiales saludos
>
>         El 01/03/2019 a las 11:24, Angel Lis escribió:
>>         Buenas Hector,
>>         creo, sin haber adentrado demasiado en tu codigo, que estas
>>         usando incorrectamente el Popen, ademas the un poco de
>>         confusion con el tema de Threads vs Processes.
>>
>>         Supongo que tu objetivo es lanzar un proceso ( programa
>>         externo, con su heap propio, etc) y cada X tiempo "checkear"
>>         si  el programa ha acabado, ha fallado o cualquier cosa entre
>>         medio.
>>
>>         Con Popen, el primer parametro es un array (o lista) de
>>         string, que definen en proceso y los parametros, asi que en
>>         tu caso seria algo asi como:
>>
>>         comando1 = ["adb", "push" , f"{abrirzip}", " /sdcard/"]
>>
>>         Y luego, para checkear el status podrias hacer algo como esto:
>>
>>         In [3]: with
>>         subprocess.Popen(["/bin/bash","/tmp/blah.sh"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>         as myproc:
>>             ...:     while True:
>>             ...:         try:
>>             ...:             res = myproc.wait(1) #wait for the
>>         process to end for 1 second
>>             ...:             print(res) # if 0 ok, for any other
>>         value... mastercard ;)
>>             ...: print(myproc.stdout.read()) #show the output, or
>>         stderr if you want to show teh error
>>             ...:             break
>>             ...:         except subprocess.TimeoutExpired as e:
>>             ...:             print("still running")
>>             ...:             continue
>>             ...:
>>             ...:
>>         ahora mismo no puedo ofrecerte una respuesta mas extensa,
>>         pero si tienes cualqueir duda, pregunta que te respondere en
>>         cuando pueda.
>>
>>
>>         Un saludo.
>>
>>
>>
>>
>>         El vie., 1 mar. 2019 a las 10:01, Héctor J. Benítez Corredera
>>         (<facturasxebolax en gmail.com
>>         <mailto:facturasxebolax en gmail.com>>) escribió:
>>
>>             Hola empezare diciendo que soy nuevo en Python y
>>             autodidacta por lo que lo de buscar es lo único que hago.
>>
>>             Bien me encuentro en un problema el cual no consigo
>>             encontrar solución ni ningún ejemplo el cual me aclare el
>>             concepto o como usar el tema de los hilos, creo que los
>>             hilos es la solución a mi problema.
>>
>>             Bien paso a detallarlo, e programado una interface con
>>             wxpython y estoy usando Python 3.7 DE 64 BITS, la cual
>>             tiene una consola que captura stdout y stderr y da el
>>             resultado en esa consola. Los resultados vienen de la
>>             interacción con la aplicación adb.exe la cual llamo
>>             através de popen.
>>
>>             Bien todo funciona correctamente hasta que hago la
>>             llamada adb.exe através de popen y como es copiar un
>>             archivo grande al móvil la interface se cuelga hasta que
>>             no termina el proceso saliendo el mensaje la aplicación
>>             no responde…
>>
>>             Bien e leído mucho sobre los hilos y la verdad no tengo
>>             nada claro, e mirado muchos ejemplos y e intentado
>>             integrarlos pero sin éxito en ninguno.
>>
>>             Quiero algo sencillo que se ejecute popen, me deje
>>             capturar el stdout, stderr y el returncode, decir que
>>             antes de lanzar popen lanzo una ventana de Espere por
>>             favor… y deseo que no se pueda interactuar con la
>>             aplicación hasta que no termine bien o mal el proceso de
>>             popen. Esto ultimo lo consigo con la ventana de Espere
>>             por favor.
>>
>>             Bien lo ultimo que creía que me podía funcionar es:
>>
>>             http://stackoverflow.com/questions/1191374/subprocess-with-timeout/4825933#4825933
>>
>>             E visto mucho como capturar el stdout y stderr en tiempo
>>             real, e visto como actualizar la consola conforme llegan
>>             los datos a dichos parámetros pero nada de eso me
>>             interesa y los ejemplos son muy complicados para mi nivel
>>             actual.
>>
>>             Bien dejo parte del código el cual me tiene parado ya que
>>             no quiero continuar hasta encontrarle una solución al
>>             problema de la aplicación no responde.
>>
>>             Comentar que estoy en Windows 10.
>>
>>             ### Inicio código
>>
>>             wildcard = "Archivos flash (*.ZIP)|*.zip"
>>
>>             dlg = wx.FileDialog(
>>
>>             self, message="Seleccione un Archivo",
>>
>>             defaultDir=os.getcwd(),
>>
>>             defaultFile="",
>>
>>             wildcard=wildcard,
>>
>>             style=wx.FD_OPEN |
>>
>>             wx.FD_CHANGE_DIR | wx.FD_FILE_MUST_EXIST |
>>
>>             wx.FD_PREVIEW
>>
>>             )
>>
>>             if dlg.ShowModal() == wx.ID_OK:
>>
>>             paths = dlg.GetPaths()
>>
>>             for path in paths:
>>
>>             global abrirzip
>>
>>             abrirzip = path
>>
>>             global archivoresultado
>>
>>             archivoresultado = os.path.basename(abrirzip)
>>
>>             dlg.Destroy()
>>
>>             result = Result()
>>
>>             loadDlg = PopupDialog(None, "Espere por favor...",
>>             "Ejecutando la acción, no cierre esta ventana y espere
>>             información...")
>>
>>             print(time.strftime("%H:%M:%S") + " *** Inicio de la
>>             copia al Almacenamiento Interno de " + archivoresultado +
>>             " ***\n")
>>
>>             play_sound()
>>
>>             os.chdir(directorio + "/zbin")
>>
>>             ### Esto es lo que me gustaría que no bloqueara el programa
>>
>>             ### Que trabajara detrás de la ventana Espere por favor…
>>
>>             comando1 = "adb push " + abrirzip + " /sdcard/"
>>
>>             p = Popen(comando1, stdin=PIPE, stdout=PIPE, stderr=PIPE,
>>             encoding='utf8', startupinfo=si)
>>
>>             (stdout, stderr) = p.communicate()
>>
>>             ### Estos datos tengo que tener la posibilidad después de
>>             que termine popen..
>>
>>             result.exit_code = p.returncode
>>
>>             result.stdout = stdout
>>
>>             result.stderr = stderr
>>
>>             result.command = comando1
>>
>>             result.convert1 = stdout.replace("\n\n", "")
>>
>>             result.convert2 = stderr.replace("\n\n", "")
>>
>>             if p.returncode != 0:
>>
>>             stop_sound()
>>
>>             loadDlg.Destroy()
>>
>>             dlg = wx.MessageDialog(None, "Error al copiar el archivo
>>             " + archivoresultado + " al Almacenamiento Interno.\n
>>             Asegúrese de estar en modo Recovery, el móvil conectado
>>             al PC y detectado por Windows.\n Si el error persiste
>>             igualmente asegúrese que los cables funcionan
>>             correctamente.\n Revise el Log en la pantalla principal
>>             para saber el resultado.", "Error", wx.OK | wx.ICON_ERROR)
>>
>>             dlg.ShowModal()
>>
>>             dlg.Destroy()
>>
>>             print(result.convert1)
>>
>>             print(result.convert2)
>>
>>             print(time.strftime("%H:%M:%S") + " *** Fin de la copia
>>             al Almacenamiento Interno de " + archivoresultado + " ***\n")
>>
>>             errorgeneral()
>>
>>             else:
>>
>>             stop_sound()
>>
>>             loadDlg.Destroy()
>>
>>             dlg = wx.MessageDialog(None, "Se a copiado correctamente
>>             el archivo " + archivoresultado + " al Almacenamiento
>>             Interno.\n Le dejo mas información en el Log de la
>>             pantalla principal.\n Al aceptar empezara la instalación
>>             del archivo.", "Información", wx.OK | wx.ICON_INFORMATION)
>>
>>             dlg.ShowModal()
>>
>>             dlg.Destroy()
>>
>>             print(result.convert1)
>>
>>             print(result.convert2)
>>
>>             print(time.strftime("%H:%M:%S") + " *** Fin de la copia
>>             al Almacenamiento Interno de " + archivoresultado + " ***\n")
>>
>>             zipinterno1()
>>
>>             return result
>>
>>             else:
>>
>>             dlg.Destroy()
>>
>>             errorarchivo()
>>
>>             ### Fin código
>>
>>             Bueno estaré muy agradecido al que eche un poco de luz al
>>             cacao mental que llevo sobre el tema de los hilos y
>>             agradecido por toda la información que me podáis brindar.
>>
>>             Cordiales saludos Héctor.
>>
>>             _______________________________________________
>>             Python-es mailing list
>>             Python-es en python.org <mailto:Python-es en python.org>
>>             https://mail.python.org/mailman/listinfo/python-es
>>
>>
>>
>>         -- 
>>         --
>>         Àngel Lis.
>>
>>         _______________________________________________
>>         Python-es mailing list
>>         Python-es en python.org  <mailto:Python-es en python.org>
>>         https://mail.python.org/mailman/listinfo/python-es
>         _______________________________________________
>         Python-es mailing list
>         Python-es en python.org <mailto:Python-es en python.org>
>         https://mail.python.org/mailman/listinfo/python-es
>
>     _______________________________________________
>     Python-es mailing list
>     Python-es en python.org <mailto:Python-es en python.org>
>     https://mail.python.org/mailman/listinfo/python-es
>
>
>
> -- 
> hiko_hitokiri no pidas que el mundo te trate de una manera cuando tu 
> no le das el mismo trato a los demás
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20190314/43cc0af9/attachment.html>


Más información sobre la lista de distribución Python-es