[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 Feb 28 14:44:36 EST 2019


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.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20190228/4d095f87/attachment.html>


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