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方法,我们可以确保在同一时间只有一个线程可以访问共享资源。这种同步机制可以帮助我们避免线程间的竞争条件,并确保多个线程可以安全地访问和修改共享资源。
