如何使用Qt延迟循环执行

时间:2010-09-30 14:16:15

标签: qt loops

在我的应用程序中,我希望在执行循环时,每次控件转移到循环时,每次执行都必须延迟特定时间。我怎么能这样做?

4 个答案:

答案 0 :(得分:48)

编辑(删除了错误的解决方案)。 编辑(添加其他选项):

使用它的另一种方法是子类QThread,因为它具有受保护的*睡眠方法。

QThread::usleep(unsigned long microseconds);
QThread::msleep(unsigned long milliseconds);
QThread::sleep(unsigned long second);

以下是创建自己的* sleep方法的代码。

#include <QThread>    

class Sleeper : public QThread
{
public:
    static void usleep(unsigned long usecs){QThread::usleep(usecs);}
    static void msleep(unsigned long msecs){QThread::msleep(msecs);}
    static void sleep(unsigned long secs){QThread::sleep(secs);}
};

你这样称呼它:

Sleeper::usleep(10);
Sleeper::msleep(10);
Sleeper::sleep(10);

相应地,这会给你10微秒,10毫秒或10秒的延迟。如果底层操作系统计时器支持该解决方案。

答案 1 :(得分:24)

作为@Live's answer的更新,对于Qt≥5.2,不再需要子类QThread,因为现在睡眠功能是公共的:

  

静态公众成员

     
      
  • QThread * currentThread()
  •   
  • Qt::HANDLE currentThreadId()
  •   
  • int idealThreadCount()
  •   
  • void msleep(unsigned long msecs)
  •   
  • void sleep(unsigned long secs)
  •   
  • void usleep(unsigned long usecs)
  •   
  • void yieldCurrentThread()
  •   

cf http://qt-project.org/doc/qt-5/qthread.html#static-public-members

答案 2 :(得分:8)

C ++ 11有一些便携式计时器的东西。查看sleep_for.

答案 3 :(得分:0)

这个问题已经有将近10年的历史了,但是在我的搜索中突然出现了,我认为在Qt中编程时有更好的解决方案:信号和插槽,计时器和有限状态机。可以实现所需的延迟,而无需以中断其他功能的方式使应用程序处于睡眠状态,无需并发编程且无需使处理器旋转,Qt应用程序将在没有事件要处理时进入睡眠状态。

为此,一个技巧是要有一个定时器序列,它们的timeout()信号连接到该事件的插槽,然后启动第二个定时器。很好,因为它很简单。它不是很好,因为如果存在逻辑分支(通常会出现在任何玩具示例之外),则很快就很难进行故障排除和维护。

QTimer

更好,更灵活的选择是Qt中的State Machine基础结构。在那里,您可以为具有多个状态和分支的任意事件序列配置框架。随着时间的推移,FSM的定义,扩展和维护更加容易。

Qt State Machine