Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QThread::更改系统时间时,睡眠无法正常工作_C++_Qt - Fatal编程技术网

C++ QThread::更改系统时间时,睡眠无法正常工作

C++ QThread::更改系统时间时,睡眠无法正常工作,c++,qt,C++,Qt,请帮我解决这个问题 我创建了一个具有QThread的QT应用程序。在run函数中,使用QThread::sleep In while(1)循环。我把qDebug放在叫睡眠之前。当我运行程序时。“睡眠”日志将每1秒打印一次。 之后,我通过命令timedatectl set time‘2015-11-23 08:10:40’更改系统时间。 现在,“睡眠”日志不再打印出来了 void TestThread::run() { while (1) { qDebug() <&l

请帮我解决这个问题

我创建了一个具有QThread的QT应用程序。在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);
    }
}
void TestThread::run()
{
而(1){

根据您的经验得出的qDebug()QThread::sleep并不是根据某个稳定的时钟来实现的,因此时间的向后移动并不像您期望的那样工作

所以,问题是:你想要什么?一个能够抵抗时间变化的睡眠功能?
然后在派生的QThread类中实现一些函数,将当前时间点保存为,然后根据该时间点进行检查自上次调用以来已通过。当然,这是活动等待,应该通过传递控件而不是执行另一个循环来改进。

在研究源代码后,我发现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);
}
遵循此线程。如果支持时钟选择选项,则条件变量应具有时钟属性,该属性指定用于测量Abtime参数指定的时间的时钟。当发生此类超时时,pthread_cond_timedwait()应释放并重新获取互斥体引用的互斥体。pthread_cond_timedwait()函数也是一个取消点


因此,如果我将系统更改为pass,sleep函数将一直休眠到meet>=系统时间开始休眠+休眠期。

听起来很奇怪。出于好奇:如果将时间设置回今天(设置为过去后),线程是否会再次打印是的!它又打印了。太令人惊讶了!fwiw,不同的库,类似的问题:我记得Glib为()提供了
sleep\u
sleep\u until()
。其中一个是Windows中的故障(不幸的是,我忘了是哪一个)。可能是,您的系统的实现已经中断。您的操作系统是什么?可能是,在您的特定操作系统上深入研究
nanosleep()
(我必须承认,我在Windows上开发的时间很长(虽然我尝试编写可移植代码)。在我使用Linux和Irix之前,但那是很久以前的事了…)另一个提示:我刚刚看到了
void QThread::yieldCurrentThread()
,它可以完全用于移交控件。感谢您的回答。在我的项目中,我想创建一个线程,每900毫秒选通一次看门狗(看门狗定时器设置为1s).用户可以更改系统时间。系统将重新启动,因为线程如上所述处于挂起状态。我在unistd.h中使用sleep函数解决问题,它工作正常。但是,我的老板要求解释为什么QThread::sleep不工作。