2016-03-28 44 views
0

我的应用程序中有一个工作线程,偶尔会收到应该快速显示在QML UI中的信息。当我有这样的信息部分时,我发出信号,这是由UI线程上的对象接收的。Qt信号到达UI线程明显延迟

我希望这个过程能够非常快速地响应,以便尽可能快地在QML UI中显示更改(这很重要,因为工作线程处理外部控制器,并且我希望用户与控制器交互的最短“关键路径” UI更改)。

但是我发现,emit signal()和在UI线程中调用的槽之间的时间差总是20-40毫秒。为什么这样?

我能做些什么来加速这个?信号发射后我在工作线程中尝试调用QCoreApplication::processEvents(),但这几乎没有改变任何东西。

的几点思考:

  • 我可以打电话processEvents但不知何故UI线程?
  • 使用具有高优先级的事件代替信号。它会有帮助吗?

OS:Win8.1,Qt的5.5

+0

QCoreApplication :: processEvents用于UI线程的事件循环。发布更多关于信号连接,插槽处理程序,UI运行循环的代码。 – hiitiger

+0

鉴于QML以刷新率刷新,您将在60Hz刷新率下有16.6ms的延迟*无论如何*。 20ms的延迟是正常的,40ms的延迟也是错误的。你的用户无论如何都说不清,那么问题是什么。你想做什么?顺便说一句,'processEvents'几乎不需要任何正确书写的代码。你绝对*不需要它。 –

回答

0

当你发出从工作线程UI线程的信号,它被放入UI事件队列,当事件队列泵和交付达到那个信息。如果你的工作线程比你的UI线程的优先级更高,那么UI线程将不得不等待工作线程阻塞。如果工作者线程具有相同的优先级,则它将完成它的时间量,可能是20ms。你可以让你的信号直接连接而不是排队,然后你需要自己处理线程安全。

+0

“UI线程必须等到工作线程阻塞” - 这些信息来自哪里?线程并行执行 –

+0

如果您的工作线程的优先级高于您的UI线程,那么UI线程将不得不等待,直到工作线程阻塞。 – dgsomerton

+0

@Alexey Andronov:“线程并行执行”不是在单个核心系统上,即使在多核上,信号/时隙消息传递也需要同步 –