系统时间更改后,QThread :: sleep无法正常工作

时间:2018-04-26 09:27:07

标签: c++ qt

请帮我解决这个问题。

我创建的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);
    }
}

感谢您的帮助!

2 个答案:

答案 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,然后检查它。如果自上次通话以来已经过了足够的秒数。当然,这是主动等待,应该通过传递控制而不是做另一个循环来改进。