请帮我解决这个问题。
我创建的QT应用程序有一个QThread。在run函数中,使用QThread :: sleep in while(1)循环。我在调用睡眠之前放了qDebug。当我运行该程序。 '睡眠'日志将每1秒打印一次。 之后,我通过命令timedatectl set-time'2015-11-23 08:10:40'更改系统时间。 现在,“睡眠”日志不再打印出来了!
void TestThread::run()
{
while (1) {
qDebug() << "sleep";
sleep(1);
}
}
感谢您的帮助!
答案 0 :(得分:1)
在调查源代码后,我发现QThread :: sleep已实现:
void QThread::sleep(unsigned long secs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_sec = tv.tv_sec + secs;
ti.tv_nsec = (tv.tv_usec * 1000);
thread_sleep(&ti);
}
static void thread_sleep(struct timespec *ti)
{
pthread_mutex_t mtx;
pthread_cond_t cnd;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cnd, 0);
pthread_mutex_lock(&mtx);
(void) pthread_cond_timedwait(&cnd, &mtx, ti);
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cnd);
pthread_mutex_destroy(&mtx);
}
关注此帖子https://linux.die.net/man/3/pthread_cond_timedwait。如果支持Clock Selection选项,则条件变量应具有clock属性,该属性指定用于测量abstime参数指定的时间的时钟。发生此类超时时,pthread_cond_timedwait()仍然会释放并重新获取互斥锁引用的互斥锁。 pthread_cond_timedwait()函数也是一个取消点。
这样,如果我将系统更改为通过,睡眠功能将一直睡眠,直到遇到&gt; =系统时间开始睡眠+睡眠期。
答案 1 :(得分:0)
从你的经验中得出QThread :: sleep并不是针对一些稳定的时钟实现的,因此向后移动并不像你期望的那样工作。
所以,问题是:你想要什么?睡眠功能对防止时间变化具有防篡改功能? 然后在派生的QThread类中实现一些函数,它将当前时间点保存为http://en.cppreference.com/w/cpp/chrono/steady_clock,然后检查它。如果自上次通话以来已经过了足够的秒数。当然,这是主动等待,应该通过传递控制而不是做另一个循环来改进。