欢迎访问宙启技术站
智能推送

利用qtpy.QtCoreQThread()实现异步编程和多线程通信

发布时间:2024-01-17 21:01:15

QThread是Qt中用于实现多线程编程的类,可以用于在后台执行耗时操作,从而实现异步编程。在多线程编程中,线程间的通信是一个重要的问题,Qt提供了信号与槽机制来实现线程间的通信。

下面是一个使用QThread实现异步编程和多线程通信的例子:

from qtpy.QtWidgets import QApplication, QLabel
from qtpy.QtCore import QThread, Qt, Signal

class WorkerThread(QThread):
    # 定义信号,用于线程间的通信
    result_ready = Signal(str)

    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)

    def run(self):
        # 在这里执行耗时操作,比如网络请求、文件读写等
        # 这里简单地模拟一个耗时操作
        import time
        time.sleep(3)
        result = "耗时操作完成"
        self.result_ready.emit(result)


class MainWindow(QLabel):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setText("点击按钮开始耗时操作")
        self.setAlignment(Qt.AlignCenter)
        self.setFixedSize(300, 200)

        self.thread = None

    def start_operation(self):
        if self.thread is None:
            self.thread = WorkerThread()
            self.thread.result_ready.connect(self.on_result_ready)
            self.thread.finished.connect(self.on_thread_finish)
            self.thread.start()
            self.setText("正在执行耗时操作")
            self.setEnabled(False)

    def on_result_ready(self, result):
        self.setText(result)

    def on_thread_finish(self):
        self.setEnabled(True)
        self.thread = None


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

在这个例子中,我们创建了一个继承自QThread的WorkerThread类,在run()方法中模拟了一个耗时操作,并通过emitemit()方法发射了一个信号result_ready,告诉主线程耗时操作已经完成。主线程通过连接这个信号的槽方法on_result_ready来接收耗时操作的结果。

在主线程中,我们创建了一个继承自QLabel的MainWindow类,当点击按钮时,会调用start_operation方法来启动耗时操作的线程。线程启动后,按钮状态被禁用,界面文字变成“正在执行耗时操作”。耗时操作完成后,会调用on_result_ready方法来更新界面文字,并使按钮重新可点击。

通过这样的方式,我们可以在界面上执行耗时的操作,而不会阻塞主线程,保持界面的响应。同时,通过信号与槽机制,可以方便地实现线程间的通信。