[Python-mx] Dudas sobre hilos (Pyqt4)

Edmundo Cazarez ecazarez at gmail.com
Fri Apr 1 20:01:55 EDT 2016


Hola Hiram,

Tu problema no tiene que ver con Qt, si no con los threads.
Regularmente cuando quieres comunicarte entre threads lo haces con una de
dos formas:

a) utilizas un recurso compartido entre todos los threads (p. ej. una
variable global al programa o un archivo de entrada/salida, protegido por
mecanismos de mutex -- un token o un semáforo -- para asegurar que las
actualizaciones a este recurso se realizan de forma correcta en el contexto
de tu problema)

b) utilizando "mensajes" entre los threads. Para eso puedes usar una cola
en la que pongas los elementos que indiquen para que thread es el mensaje y
cual es el mensaje que estas enviando.

Saludos.
-- Edmundo.


On Fri, Apr 1, 2016 at 5:38 PM Hiram <hiramhzr at gmail.com> wrote:

> Muchas gracias por la información,
>
> Estuve viendo algunos ejemplos y pude actualizar la imagen desde el hilo
> principal, la actualizo cuando el hilo secundario me cambia una bandera leo
> esa variable y logro cambiar la imagen, el problema es que no se como poder
> ejecutar la función que cambia la función cada n tiempo sin usar otro hilo
> ya que si lo genero vuelve a pasar lo mismo, acá un poco de código de lo
> que comento.
>
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
>
> import sys
> from PyQt4 import QtGui
> from PyQt4 import QtCore
> from time import strftime
> import time
> import threading
> import subprocess
> from PyQt4.QtGui import QApplication
>
> class cambiarImagen(threading.Thread):
>     def __init__(self, parent):
>            threading.Thread.__init__(self)
>            self.parent = parent
>
>     def run(self):
>         while(True):
>             time.sleep(0.5)
>             self.parent.ok = self.parent.cambio()
>             print self.parent.ok
>
>
> class mainWin(QtGui.QMainWindow):
>     def __init__(self):
>         super(mainWin, self).__init__()
>         self.initUI()
>         self.esS = cambiarImagen(self)
>         self.esS.daemon = True
>         self.esS.start()
>         self.ok = True
>         QtCore.QTimer.singleShot(2000, self.runLoop)
>
>     def initUI(self):
>         self.imgCobrar = QtGui.QLabel(self)
>         self.imgCobrar.setPixmap(QtGui.QPixmap("ok.png"))
>         self.imgCobrar.move(0,5)
>         self.imgCobrar.resize(96, 96)
>
>         self.setGeometry(300, 300, 200, 240)
>         self.setWindowTitle('Test')
>         self.show()
>
>     def runLoop(self):
>         print 'lo ejecute desde el hilo principal'
>         if self.ok == False:
>             self.imgCobrar.setPixmap(QtGui.QPixmap("no.png"))
>             QtGui.qApp.processEvents()
>         else:
>             print 'No cambio la imagen'
>
>     def cambio(self):
>         print 'lo ejecute desde el hilo secundario'
>         if self.ok == True:
>             return False
>         else:
>             return True
>         #from time import sleep
>         #self.imgCobrar.setPixmap(QtGui.QPixmap("no.png"))
>         #QtGui.qApp.processEvents()
>         #sleep(1)
>
> def main():
>     app = QtGui.QApplication(sys.argv)
>     ex = mainWin()
>     ex.show()
>     sys.exit(app.exec_())
>
>
> if __name__ == '__main__':
>     main()
>
> Ahora la situación es como ejecutar la función runLoop cada cierto tiempo
> desde el hilo principal.
>
> Desde ya muchas gracias.
> --
> Hiram
> _______________________________________________
> Python-mx mailing list
> Python-mx at python.org
> https://mail.python.org/mailman/listinfo/python-mx
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-mx/attachments/20160402/57022624/attachment.html>


More information about the Python-mx mailing list