在我的应用程序中,我希望在执行循环时,每次控件转移到循环时,每次执行都必须延迟特定时间。我怎么能这样做?
答案 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()信号连接到该事件的插槽,然后启动第二个定时器。很好,因为它很简单。它不是很好,因为如果存在逻辑分支(通常会出现在任何玩具示例之外),则很快就很难进行故障排除和维护。
更好,更灵活的选择是Qt中的State Machine基础结构。在那里,您可以为具有多个状态和分支的任意事件序列配置框架。随着时间的推移,FSM的定义,扩展和维护更加容易。