Foros del Web » Programando para Internet » Python »

Windows: (Not Responding) mientras se ejecuta aplicacion

Estas en el tema de Windows: (Not Responding) mientras se ejecuta aplicacion en el foro de Python en Foros del Web. Hola, queria saber algo mas sobre lo que me ocurre al ejecutar una aplicacion hecha con QT designer: La aplicacion tiene que iterar sobre una ...
  #1 (permalink)  
Antiguo 03/12/2013, 01:57
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 11 años
Puntos: 0
Windows: (Not Responding) mientras se ejecuta aplicacion

Hola, queria saber algo mas sobre lo que me ocurre al ejecutar una aplicacion hecha con QT designer:

La aplicacion tiene que iterar sobre una PyTable muy grande, y mi intencion es que, a medida que progresa sobre la tabla vaya actualizando una "progress bar", asi como otros "labels" con indicadores numericos.

El problema es que, a los pocos segundos de empezar la ejecucion, todo va bien, hasta que la MainWindow entra en (Not Responding)...(estoy ejecutando sobre Windows 7)

Al parecer todo va bien, porque pocos segundos despues el programa termina, eso sí, sin actualizar los labels ni la progress bar, pero termina bien, eso esta comprobado, los resultados son correctos.

Sin embargo me gustaria tenes esa ayuda visual de la progress bar funcionando a mededida que avanza el loop, ademas de ir viendo tambien los resultados parciales en los diferentes labels o en los lcdDisplays.

Alguna ayuda, o algun consejo para hacer que esto funcione mejor?, parece como si el loop bloquease el "refresco" de la progrssBar y los labels.

Gracias.
  #2 (permalink)  
Antiguo 03/12/2013, 12:44
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Windows: (Not Responding) mientras se ejecuta aplicacion

Lo que pasa es estas ejecutando algo que tarda mucho tiempo en el mainloop y obviamente eso bloquea todo.

Lo que tienes que hacer es ejecutar tu proceso pesado en otro thread, para que el mainloop siga corriendo.

Busca en google hay muchos ejemplos:
http://stackoverflow.com/questions/9...ithreaded-pyqt

https://www.google.com.mx/search?q=p...m=122&ie=UTF-8
  #3 (permalink)  
Antiguo 03/12/2013, 17:41
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Windows: (Not Responding) mientras se ejecuta aplicacion

Para hacer cambios sobre tus widgets desde otro thread vas a tener que usar el sistema de señales de Qt, sino vas a obtener un error como que no se puede modificar un widgets desde un thread diferente al que lo creó.

Suerte!
  #4 (permalink)  
Antiguo 05/12/2013, 03:02
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 11 años
Puntos: 0
Respuesta: Windows: (Not Responding) mientras se ejecuta aplicacion

Gracias por vuestras respuestas!! Estoy intentando entender el tema de las señales desde los threads, pero el problema que estoy teniendo es que al enviar un parametro desde el "main" a uno de los threads para que haga algo con el no funciona, no se si esto es posible, de momento lo que he hecho es esto, por si sirve de ayuda:

Código Python:
Ver original
  1. import sys
  2. from PyQt4.QtCore import *
  3. from PyQt4.QtGui import *
  4. import time
  5.  
  6. class MyThread(QThread):
  7.     def __init__(self, name):
  8.         super(MyThread, self).__init__()
  9.         self.setObjectName(name)
  10.  
  11.     def run(self):
  12.         print "RUN", QThread.currentThread().objectName(), QApplication.instance().thread().objectName()
  13.         self.exec_()
  14.         print "RUN DONE", QThread.currentThread().objectName()
  15.  
  16. class Producer(QObject):
  17.     def __init__(self, parent=None):
  18.         super(Producer, self).__init__(parent)
  19.  
  20.     def Start(self,vector):
  21.         for i in vector:
  22.             if i == 1:
  23.                 self.emit(SIGNAL("testsignal"),1)
  24.                 time.sleep(2)
  25.              else:
  26.                 self.emit(SIGNAL("testsignal"),0)
  27.                 time.sleep(2)
  28.  
  29.         time.sleep(1)
  30.         qApp.quit()
  31.  
  32. class Consumer(QObject):
  33.     def __init__(self, parent=None):
  34.         super(Consumer, self).__init__(parent)
  35.  
  36.     def Consume(self, i):
  37.         print "Value = ",i
  38.  
  39. if __name__ == "__main__":
  40.     vector = [0,1,0,1,1,0,0,1,0]
  41.     app = QApplication([])
  42.     producer = Producer()
  43.     consumer = Consumer()
  44.     QThread.currentThread().setObjectName("MAIN")
  45.     producerThread = MyThread("producer")
  46.     consumerThread = MyThread("consumer")
  47.     producer.moveToThread(producerThread)
  48.     consumer.moveToThread(consumerThread)
  49.     producerThread.started.connect(producer.Start(vector))
  50.     producer.connect(producer, SIGNAL("testsignal"), consumer.Consume)
  51.     def aboutToQuit():
  52.         producerThread.quit()
  53.         consumerThread.quit()
  54.         time.sleep(1)
  55.     qApp.aboutToQuit.connect(aboutToQuit)
  56.     consumerThread.start()
  57.     time.sleep(.1)
  58.     producerThread.start()
  59.     sys.exit(app.exec_())

Y el error que me esta dando

Código Python:
Ver original
  1. Traceback (most recent call last):
  2.   File "<stdin>", line 1, in <module>
  3.   File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
  4.     execfile(filename, namespace)
  5.   File "C:/Users/Desktop/Python Test/toDelete.py", line 56, in <module>
  6.     producerThread.started.connect(producer.Start(vector))
  7. TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:32.