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

PyQt5.QtCoreQMutex()的使用示例:实现多个线程间的同步

发布时间:2024-01-10 01:40:06

在PyQt5中,QMutex是一个线程同步构件,用于多个线程之间的同步。它可以确保在同一时间只有一个线程可以访问共享资源,从而避免线程间的竞争条件。

以下是一个使用QMutex的示例,演示如何在多个线程之间实现同步:

import sys
from PyQt5.QtCore import QMutex, QThread, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel

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

    def run(self):
        while True:
            self.mutex.lock()
            # 在此处执行需要同步的代码
            print("Thread {}: Executing synchronized code!".format(self.currentThreadId()))
            self.mutex.unlock()
            self.msleep(1000)  # 每隔1秒执行一次

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("Thread Example")
        self.resize(250, 150)

        self.mutex = QMutex()

        self.button = QPushButton("Start Thread", self)
        self.button.setGeometry(75, 50, 100, 30)
        self.button.clicked.connect(self.onButtonClick)

        self.label = QLabel(self)
        self.label.setGeometry(75, 100, 100, 30)

        self.workerThread = WorkerThread(self.mutex)

    def onButtonClick(self):
        if self.workerThread.isRunning():
            self.workerThread.terminate()
            self.button.setText("Start Thread")
        else:
            self.workerThread.start()
            self.button.setText("Stop Thread")

    def closeEvent(self, event):
        if self.workerThread.isRunning():
            self.workerThread.quit()
            self.workerThread.wait()

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

    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec_())

在上述代码中,我们首先创建了一个QMutex对象,作为共享资源的锁定机制。然后,我们定义了一个WorkerThread类,继承自QThread。WorkerThread类中的run方法中包含了需要同步的代码。在每次执行需要同步的代码之前,我们使用mutex.lock()来锁定共享资源,确保只有当前线程可以访问。在执行完同步的代码后,我们使用mutex.unlock()来解锁共享资源,让其他线程可以访问。

MainWindow类是主窗口类,包含一个QPushButton和一个QLabel。用户可以点击按钮来启动或停止WorkerThread线程。当点击按钮启动线程后,线程将会执行run方法中的同步代码。

在closeEvent方法中,我们检查当前线程是否正在运行。如果是,则我们发送一个quit信号给线程并等待线程结束。

在运行该示例时,你可以看到每秒钟打印一次“Thread x: Executing synchronized code!”的消息。这说明多个线程之间的同步工作正常。

总结:在PyQt5中,使用QMutex可以实现多个线程间的同步。通过在需要同步的代码块前后加上lock和unlock方法,我们可以确保在同一时间只有一个线程可以访问共享资源。这种同步机制可以帮助我们避免线程间的竞争条件,并确保多个线程可以安全地访问和修改共享资源。