Cómo aprender cuda en un mes…

…y otros cuentos

Comunicación entre QThread con slot y signal

dejar un comentario »

Es habitual crear un hilo QThread que haga un proceso en segundo plano y vaya avisando de su estado. En mi caso tengo un QTextEdit que me sirve de log para escribir cualquier cosa. El problema es que QT tiene mecanismos de seguridad que impiden a un QThread comunicarse con un QObject creado en otro hilo, como es la interfaz.

Para eso se aprovecha el sistema de signals y slots que permiten la comunicación.

Emisor: clase QThread

Hay que definir una signal en la clase emisora (que será un hilo QThread), el código queda así:

class FileAccess : public QObject, public QThread{
 Q_OBJECT
 public:

  FileAccess(Logic *myLogic){}
  ~FileAccess(){}
  void run(){
    emit writeState("Running thread");
  }
 signals:
  void writeState(QString q);
};

Como se puede apreciar, hemos creado nuestra propia señal de nombre writeState que recibe una QString y se emite nada más entrar en la ejecución del hilo.

Conexión con el receptor

Esta señal debe conectarse con el receptor, en mi caso un QTextEdit, para eso se utiliza el método connect():

fa = new FileAccess(); //nuevo hilo
QObject::connect(fa, SIGNAL(writeState(QString)), myTextEdit, SLOT(append(QString)), Qt::QueuedConnection);
fa->start(); //lanzar hilo
fa->wait(); //esperar a que el hilo termine o hacer nuestras tareas

Destaco la segunda línea: conectamos la señal writeState del objeto fa con el slot append del objeto myTextEdit.

Advertisement

Escrito por cudagpu

6 junio 2011 a 11:09

Escrito en Qt

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.