如何(正确)使用新的连接设置更新工作人员QThread?

时间:2015-02-23 16:56:10

标签: python qt pyqt

假设我有一个用于在我的应用程序中运行插件的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秒触发插件的执行方法。 任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

有几种解决方案。虽然我没有和QT合作过。

如果是我的代码,我会杀死该线程并使用更新的连接设置启动一个新线程。

在线程构造中,将一个threading.Event对象传递给线程,并保存主线程的引用。更新连接字符串时,设置事件并创建新线程(传递新的事件对象)。如果已设置事件,则在线程函数内返回。