【问题标题】:Mechanism of QTimerQTimer的机制
【发布时间】:2014-05-20 03:35:11
【问题描述】:

假设timerQTimer的一个对象,定时器的间隔是iInterval,定时器的超时信号连接到一个槽sltTimeout()

我只是在想如果iInterval 小于sltTimeout() 运行所需的时间会发生什么。多个线程会因此运行sltTimeout() 吗?如果是这样,似乎可能会导致对对象的非同步访问出现问题。

谁能澄清一下?

【问题讨论】:

    标签: c++ qt qtcore qt-signals qtimer


    【解决方案1】:

    QTimer 在启动它的线程上运行。因为它只在一个线程上运行,所以它不可能在前一个槽函数返回之前多次发出 timeout() 信号。

    来自QTimer documentation

    Qt 使用计时器的线程亲和性来确定哪个线程将发出 timeout() 信号。

    【讨论】:

    • 我认为这不是 OP 所要求的。 OP 要求并行执行时隙 (sltTimeout),而不是计时器本身。
    • @GregHewgill 我昨天读到'Qt 使用计时器的线程亲和性来确定哪个线程将发出 timeout() 信号',但我没有得到它。现在我通过比较 threadid 来确认你的答案。
    • @JandunCN:重要的是要清楚。 Greg 很幸运在这里和你有同样的想法,但你的问题不清楚,在我的解释中,它询问插槽在哪里并行运行,而不是信号发射是否在不同的线程中完成。今后请牢记。如果只是关于emit和slot的线程问题,我会说它是重复的,但是基于当前的文本,我不敢这样标记。
    【解决方案2】:

    多个线程会因此运行 sltTimeout() 吗?

    它不会自动运行,所以不会。如果需要,您将需要确保这样做,例如如果它正在做一些计算。

    如果是这样,似乎可能会导致对对象的非同步访问出现问题。

    是和不是。

    在这种情况下没有什么特别的,只是一般的线程编程。您需要使用线程同步原语,如 QMutex、QMutexLocker、QSemaphore 等。

    您可以做的另一个技巧是在处理槽时停止计时器调用,但您可能不希望采取妥协。

    不要忘记默认情况下该事件将排队,因此如果您在下一次运行中不依赖 sltTimeout 的上一次运行,您甚至可以忽略线程“如果您有足够的时间”来完成它。如果后续调用之间存在依赖关系,那么是的,您需要在代码中变得聪明。

    【讨论】:

    • 其实我只是想知道信号发出的线程和sltTimeout()运行的线程是否相同。谢谢大家给我关于同步编程的提示.
    • @JandunCN:这不是你的问题。以后请尽量说清楚。
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2019-02-01
    • 2017-07-05
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多