¿Cómo terminar correctamente un QThread desde una aplicación GUI?

Intenté usar self.terminate() en la clase QThread, y también self.thread.terminate() en la clase GUI. También intenté poner self.wait() en ambos casos. Sin embargo, hay dos escenarios que suceden:

1) El subproceso no termina en absoluto, y la GUI se bloquea al esperar que el subproceso finalice. Una vez que el hilo finaliza, la GUI se descongela y todo vuelve a la normalidad.

2) El hilo realmente termina, pero al mismo tiempo congela toda la aplicación.

También traté de usar self.thread.exit() . Sin alegría.

Para aclarar aún más, estoy intentando implementar un botón de cancelación de usuario en la GUI que terminaría la ejecución del subproceso en cualquier momento.

Gracias por adelantado.

EDITAR:

Aquí está el método run() :

 def run(self): if self.create: print "calling create f" self.emit(SIGNAL("disableCreate(bool)")) self.create(self.password, self.email) self.stop() self.emit(SIGNAL("finished(bool)"), self.completed) def stop(self): #Tried the following, one by one (and all together too, I was desperate): self.terminate() self.quit() self.exit() self.stopped = True self.terminated = True #Neither works 

Y aquí está el método de la clase GUI para abortar el hilo:

 def on_abort_clicked(self): self.thread = threadmodule.Thread() #Tried the following, also one by one and altogether: self.thread.exit() self.thread.wait() self.thread.quit() self.thread.terminate() #Again, none work 

De la documentación de Qt para QThread :: terminate:

Advertencia : esta función es peligrosa y se desaconseja su uso. El hilo se puede terminar en cualquier punto de su ruta de código. Los hilos pueden terminarse mientras se modifican los datos. No hay posibilidad de que el hilo se limpie después de sí mismo, desbloquee cualquier exclusión mutua, etc. En resumen, use esta función solo si es absolutamente necesario.

Probablemente sea una idea mucho mejor repensar su estrategia de subprocesos, de modo que, por ejemplo, puede usar QThread :: quit () para indicar al subproceso que se cierre de forma limpia, en lugar de intentar que el hilo termine de esta manera. En realidad, llamar a thread.exit () desde dentro del subproceso debería hacerlo según cómo haya implementado run (). Si desea compartir el código de su método de ejecución de subprocesos, esto podría indicar por qué no funciona.