2012-03-09 19 views
5

Estoy buscando una solución para programar la eliminación de un objeto en los hilos. Los documentos sobre cómo se comporta deleteLater no son del todo claros. ¿Puedo llamar a esta función en un hilo que no es el propietario del objeto?QObject :: deleteLater en un QThread

Por ejemplo, Object X es propiedad de Thread A, y en Thread B me gustaría eliminar Object X. Como el objeto puede estar dentro del procesamiento de eventos en este momento (en el Subproceso A), no puedo borrarlo de manera segura hasta que vuelva al ciclo de mensajes. Si llamo al deleteLater desde el Subproceso B, los documentos parecen indicar que se eliminará tan pronto como el Subproceso B regrese al ciclo de mensajes.

Actualmente tengo el enfoque de tener una señal emitida en el Subproceso A que está conectado a una ranura que llama al deleteLater. Me pregunto si existe una forma más fácil de hacerlo, si puedo llamar al deleteLater desde cualquier hilo.

+0

En Qt puede cambiar qué hilo posee un objeto. ¿Eso te ayudaría? – sashoalm

+0

Así es como el objeto entra en el hilo. –

Respuesta

0

deleteLater() solo significa que el objeto se eliminará después de que todas las ranuras/señales int en el bucle de evento actual (es decir, ThreadB) hayan sido tratadas.

Por lo tanto, si ninguna otra ranura necesita ObjectX en ThreadB, es equivalente a delete.

Si puede eliminar el objeto o no y cómo se manejará en ThreadA depende de la lógica de su aplicación.

Si ObjectX es el objeto principal de la secuencia, enviar la señal quit() a ThreadA es el camino a seguir.

+0

Habrá muchos de tales objetos, el hilo es un objeto distinto. Sin embargo, estás confirmando que deleteLater sí ocurre solo en el hilo actual (por lo tanto, no es seguro para mi uso). –

+0

@ edA-qamort-ora-y Esto depende de la versión de Qt que esté utilizando. Vea el comentario de 'Lol4t0' debajo de su pregunta. –

6

Mientras deleteLater() no es segura en sí, se puede invocar en object 's threadA con llaman meta:

metaObject()->invokeMethod(object, "deleteLater", Qt::QueuedConnection); 

Entonces, será seguro.

+0

Me preocupa que los documentos digan solo "bucle de evento principal" para la conexión en cola aquí (bastante diferente de cómo funciona generalmente una conexión en cola). ¿ES esto solo un error de doc, será esto realmente como una señal normal introducida en el otro hilo? –

+0

@ edA-qamort-ora-y, Bueno, parece ser un error de documentación, y eliminé objetos con ese código, pero mientras estudiaba el código fuente de Qt, encontré esa llamada directa a 'deleteLater' tan segura como meta- llamada, por lo que en la realización actual el trabajo de llamada directa y el comportamiento de versiones futuras pueden ser sorprendentes en ambos casos. – Lol4t0

+0

Seguí el código fuente ahora también y deleteLater simplemente publica un evento, y el seguimiento de los eventos publicados siempre se enviará al propietario del hilo del receptor. Argh! ¿Por qué los doctores no podían decir lo mismo? No me preocuparía ...:( –

5

Mirando el Qt 4 code y Qt 5 code, deleteLater() simplemente invoca QCoreApplication::postEvent() que se declara explícitamente flujos seguros. Por lo tanto, debería estar bien simplemente llamarlo directamente. A medida que la cola de eventos se procesa en el hilo del propietario del objeto, la eliminación ocurrirá en el hilo A.

Si desea confiar completamente en el comportamiento documentado, simplemente use postEvent().

Cuestiones relacionadas