gpt4 book ai didi

c++ - 当接收器忙时 Qt 信号会发生什么?

转载 作者:可可西里 更新时间:2023-11-01 15:49:09 27 4
gpt4 key购买 nike

在我的应用程序中,我有一个 QTimer 实例,它的 timeout() 信号连接到主窗口对象中的一个插槽,导致它被定期调用.插槽用相机拍照并将其保存到磁盘。

我想知道当接收者(主线程上的窗口对象)当前正忙(比如与拍摄并保存上一张照片)。在上一个调用终止后,调用是否排队并执行?整个想法是让它定期运行,但是这些调用会排队,然后在控制返回事件循环时随机调用,从而造成困惑吗?我怎样才能避免它?理论上插槽应该执行得很快,但假设硬件有问题并且出现停顿。

我希望在这种情况下调用被挂断而不是排队,更有用的是在它发生时使用react的能力(警告用户,终止执行)。

最佳答案

此时其他答案都有相关上下文。但要知道的关键是,如果定时器回调在不同线程中发出槽信号,那么该连接要么是 QueuedConnection,要么是 BlockingQueuedConnection。

因此,如果您正在使用计时器来尝试完成某种常规处理,那么这会给您在计时器触发和插槽实际执行之间的计时带来一些额外的抖动,因为接收对象在它自己的线程运行一个独立的事件循环。这意味着当事件被放入队列时它可能正在执行任意数量的其他任务,并且在它完成处理这些事件之前,图片线程不会执行您的计时器事件。

计时器应该与照片逻辑在同一个线程中。将定时器放在与相机拍摄相同的线程中,使连接直接,并为您的计时间隔提供更好的稳定性。特别是当照片捕获和保存偶尔有异常持续时间时。

它是这样的,假设间隔是 10 秒:

  • 设置定时器 10 秒
  • 计时器触发
  • 保存开始时间
  • 拍照
  • 将照片保存到磁盘(假设由于某些奇怪的原因需要 3 秒)
  • 计算10-(当前时间-开始时间)=七秒
  • 设置暂停七秒

您还可以在此处设置一些逻辑来检测跳过的间隔(假设其中一个操作需要 11 秒才能完成...

关于c++ - 当接收器忙时 Qt 信号会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18678101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com