pyqt:如何正确退出线程
Posted
技术标签:
【中文标题】pyqt:如何正确退出线程【英文标题】:pyqt: How to quit a thread properly 【发布时间】:2016-10-04 21:03:14 【问题描述】:我写了一个 pyqt gui 并使用线程来运行需要很长时间才能执行的代码,但我希望可以选择安全地停止执行。我不想使用 get_thread.terminate() 方法。我想通过一个特殊的函数(可能是 del())来停止代码。我的问题是,我在自己的类中编写了代码,只是想在不更改很多语法的情况下中止该类。
编辑:有人提到必须将标志传递给班级,必须不断检查。如何将此标志发送给班级?因为标志必须改变值,当一个人按下停止按钮时。
编辑 2:到目前为止,我的解决方案是取消一个名为 running_global 的全局变量。我将 self.get_thread.terminate() 更改为 running_global = False,如果变量设置为 False,我会不断检查我的 long_running_prog。我认为这个解决方案很丑,所以如果有人有更好的主意,我会很高兴。
这是我启动线程的对话框的代码:
class SomeDialog(QtGui.QDialog,
userinterface_status.Ui_status_window):
finished = QtCore.pyqtSignal(bool)
def __init__(self):
"""
:param raster: Coordinates which are going to be scanned.
"""
super(self.__class__, self).__init__() # old version, used in python 2.
self.setupUi(self) # It sets up layout and widgets that are defined
self.get_thread = SomeThread()
# Conencting the buttons
self.start_button.clicked.connect(self.start)
self.stop_button.clicked.connect(self.stop)
self.close_button.clicked.connect(self.return_main)
# Connecting other signals
self.connect(self.get_thread, QtCore.SIGNAL("stop()"), self.stop)
self.connect(self.get_thread, QtCore.SIGNAL("update_status_bar()"), self.update_status_bar)
def return_main(self):
"""
Function is excecuted, when close button is clicked.
"""
print("return main")
self.get_thread.terminate()
self.close()
def start(self):
"""
Starts the thread, which means that the run method of the thread is started.
"""
self.start_button.setEnabled(False)
self.get_thread.start()
def stop(self):
print("Stop programm.")
self.start_button.setEnabled(True)
self.get_thread.quit()
def end(self):
QtGui.QMessageBox.information(self, "Done!", "Programm finished")
def closeEvent(self, event):
"""
This method is called, when the window is closed and will send a signal to the main window to activaete the
window again.
:param event:
"""
self.finished.emit(True)
# close window
event.accept()
下面的类是线程的代码:
class SomeThread(QtCore.QThread):
finished = QtCore.pyqtSignal(bool)
def __init__(self):
QtCore.QThread.__init__(self)
def __del__(self):
print("del")
self.wait()
def run(self):
self.prog = long_running_prog(self.emit) # Sending from the prog signals
self.prog.run()
self.prog.closeSystem() # Leaving the programm in a safe way.
因此,如果按下停止按钮,程序应立即以一种保存方式关闭。有没有办法以保存的方式中止课程?例如,当按下停止按钮时,我可以将变量传递给变为 True 的 long_running_prog 类吗?如果这样的事情是可能的,有人能告诉我怎么做吗?
提前感谢您的帮助
我希望你能理解我的问题。 问候 咻咻咻
【问题讨论】:
How to properly terminate a QThread from a GUI application?的可能重复 我阅读了这个问题和答案,但对我没有帮助。 【参考方案1】:除非prog.run(self)
会定期检查标志的值以跳出其循环,否则这是不可能的。一旦你实现它,线程上的__del__(self)
应该设置标志,然后才设置wait
。
【讨论】:
好的,我想这实现起来很快。你能给我写一些示例代码吗?感谢您的帮助。以上是关于pyqt:如何正确退出线程的主要内容,如果未能解决你的问题,请参考以下文章
在pyqt5中退出GUI时终止正在运行的进程的正确方法是什么?