[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