首页 > 解决方案 > 带有互斥锁的 QTimer 会导致程序意外退出吗?

问题描述

我们所知道的:

我的问题是:

假设我有一个非常耗时的函数 F1 在一个线程中使用带有互斥锁的变量 A。而且,QTimer 正在运行一个循环调用函数 F2,该函数还在另一个线程中使用 A 和互斥锁。如果 F1 正在运行并且 A 被锁定,则 F2 将等待 A 解锁。QTimer 会在 F1 无限期运行时堆叠很多 F2 调用吗?

标签: pythonmultithreadingpyqtmutexqtimer

解决方案


似乎 Pyqt 会处理它。以下是两个示例线程:

class test_thread(QThread):
    timer = QTimer()

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.timer.timeout.connect(self.start)

    def run(self):
        print("call")
        global mutex
        global n
        mutex.lock()
        n = n + 1
        print(n)
        mutex.unlock()

    def process(self):
        self.timer.start(1000)

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

    def run(self):
        global mutex
        mutex.lock()
        while True:
            global  n
            n = n - 1
            print(n)
            time.sleep(1)
        mutex.unlock()

测试两种情况:

  1. test_thread1 没有time.sleep(1)

    test_thread 中的“调用”将永远不会被打印,并且 n 正在倒计时。

  2. test_thread1 与time.sleep(1)

    “呼叫”只出现一次,n 也在倒计时。


推荐阅读