控制QTimer的时间

Controlling time of QTimer?

本文关键字:时间 QTimer 控制      更新时间:2023-10-16

我正在考虑使用c++和Qt重写一些现有的C代码。在C代码中,poll用于检查来自几个源的输入,每个源都有超限时值和一些特定的行为与之相关。例如

  • intput0上沉默5分钟后,我们假设对方已死亡,我们尝试重新建立联系
  • 我们希望客户端连接到socket0
  • 一旦客户端连接到socket0,呼叫accept (socket1),客户端在socket1关闭之前有一分钟的时间发出请求

这种事情不是太难测试,通过使用LD_PRELOAD和"隐藏"所涉及的系统功能(poll, gettimeofday),可以(某种程度上)轻松地控制时间的流逝和触发超时。

移动到Qt,我计划在QSocketNotifier的实例中包装文件描述符,并将activated(int)信号连接到合适的插槽。这基本上提供了一个qt风格的poll—除了没有超时!

对于超时,我正在考虑将QTimer耦合到每个QSocketNotifier。我的实验表明这是有效的,而且相当优雅。然而,测试并不令人愉快。我真的不能让测试等待5分钟等待超时。

我如何使这个解决方案中的超时可测试?

(或者我只是想错了,应该做一些完全不同的事情。)

我相信这个问题可以被解释为"如何嘲笑QTimer"?这个问题的答案是"间接的"。您可以使用QTimer的抽象来编写主程序,然后测试代码会模拟它,以根据测试需要而不是基于时间发出信号。

解决这个问题的一种特殊方法可能是测试代码将插槽与QTimer的信号断开,并在其位置连接自己的信号。