假设我有一个用于在我的应用程序中运行插件的QThread,并且该插件连接到用户指定的服务器。当用户更改服务器设置时,插件应该连接到新服务器 - 正如预期的那样。当用户更新设置时,简单地终止当前插件工作线程并启动新线程是不是一个好主意?
这就是我现在所得到的
class MainWindow(QMainWindow):
def __init__(self):
# ...
self.hostname.editingFinished.connect(
lambda: self._setup_new_server() or
self._restart_plugin_work_thread()
)
self.port.editingFinished.connect(
lambda: self._setup_new_server() or
self._restart_plugin_work_thread()
)
def _create_plugin_worker_thread(self):
self.plugin_worker_thread = QtCore.QThread()
self.plugin_worker = PluginWorker()
self.plugin_worker.moveToThread(self.plugin_worker_thread)
self.plugin_worker_thread.start()
self.plugin_worker.run_plugin_signal.connect(self.plugin_worker.run_plugin)
self.plugin_worker.stop_plugin_signal.connect(self.plugin_worker.stop_run_plugin)
def _terminate_plugin_worker_thread(self):
self.plugin_worker_thread.terminate()
def _restart_plugin_work_thread(self):
# terminate the current worker thread
self._terminate_plugin_worker_thread()
# create a new worker thread
self._create_plugin_worker_thread()
class PluginWorker(QtCore.QObject):
run_plugin_signal = QtCore.Signal(str, int, str, str)
stop_plugin_signal = QtCore.Signal()
# ...
PluginWorker
是工作者类,它主要依赖于QTimer
每2秒触发插件的执行方法。
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
有几种解决方案。虽然我没有和QT合作过。
如果是我的代码,我会杀死该线程并使用更新的连接设置启动一个新线程。
在线程构造中,将一个threading.Event对象传递给线程,并保存主线程的引用。更新连接字符串时,设置事件并创建新线程(传递新的事件对象)。如果已设置事件,则在线程函数内返回。