如何从 GUI 应用程序正确终止 QThread?

2023-11-26

我尝试使用self.terminate()在 QThread 类中,还有self.thread.terminate()在 GUI 类中。我也尝试过放self.wait()在这两种情况下。但是,会发生两种情况:

1) 线程根本没有终止,GUI 冻结等待线程完成。一旦线程完成,GUI 就会解冻,一切都会恢复正常。

2)线程确实终止了,但同时它冻结了整个应用程序。

我也尝试过使用self.thread.exit()。没有喜悦。

为了进一步澄清,我试图在 GUI 中实现一个用户中止按钮,它将在任何时间点终止线程的执行。

提前致谢。

EDIT:

这里是run() method:

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

这是 GUI 类用于中止线程的方法:

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

来自 QThread::terminate 的 Qt 文档:

Warning:此功能很危险,不鼓励使用。这 线程可以在其代码路径中的任何点终止。线程可以是 修改数据时终止。线程没有机会 自行清理,解锁任何持有的互斥体等。简而言之,使用 仅在绝对必要时才使用此功能。

重新考虑您的线程策略可能是一个更好的主意,这样您就可以例如使用 QThread::quit() 来通知线程彻底退出,而不是尝试以这种方式终止线程。实际上,从线程内调用 thread.exit() 应该根据您实现 run() 的方式来实现。如果您想共享线程运行方法的代码,可能会暗示它为什么不起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 GUI 应用程序正确终止 QThread? 的相关文章

随机推荐