带有互斥的QTimer会导致程序意外退出吗



我们所知道的:

  • 不带单次触发选项的QTimer将在特定间隔发出超时信号
  • 超时将在发出时调用函数
  • 互斥锁将锁定一个变量,使其不被另一个线程修改

我的问题是:

假设我有一个非常耗时的函数F1在一个线程中使用了一个变量a和一个互斥对象。并且,QTimer正在运行一个循环调用函数F2,该函数也在另一个线程中将a与互斥体一起使用。如果F1正在运行并且A被锁定,那么F2将等待A被解锁。当F1无限期运行时,QTimer会堆叠很多F2调用吗?

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. time.sleep(1) 的test_thread1

    ";呼叫";只出现过一次,n也在倒计时。

最新更新