网站建设费做什么,wordpress 会员分类,怎么才能申请自己的网站,wordpress企业免费主题是什么意思目录
QT提供延时
1.自定义延时
2.使用QElapsedTimer
3.使用事件循环
4.跨平台延时 QT提供延时
这里提供四种方法#xff1a;
1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。
Sleep不会释放对象锁#x…目录
QT提供延时
1.自定义延时
2.使用QElapsedTimer
3.使用事件循环
4.跨平台延时 QT提供延时
这里提供四种方法
1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。
Sleep不会释放对象锁其他线程无法访问对象因此会阻塞线程而Wait会释放对象锁使得其他线程能够访问该对象。
1.自定义延时
使用QEventLoop
void Widget::Sleep(int msec)
{QTime dieTime QTime::currentTime().addMSecs(msec);while( QTime::currentTime() dieTime )QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
传入参数msec使程序延时msec毫秒。这种方法不会阻塞当前线程尤其适合Qt的单线程带UI程序或者UI线程因为线程阻塞时
很明显的现象就是UI卡死。当然你也可以更改addMSecs为addSecs使程序延时msec秒。
如果去掉QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 可以延时但也会阻塞线程
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
使程序在while等待期间去处理一下本线程的事件循环处理事件循环最多100ms必须返回本语句如果提前处理完毕则立即返回这条语句
2.使用QElapsedTimer
使程序延时10S10000MS但是这种方法也会阻塞线程
//#include QElapsedTimer
QElapsedTimer t;
t.start();
while(t.elapsed()10000);
3.使用事件循环
这种方法不会阻塞线程
void Delay_MSec(unsigned int msec)
{QEventLoop loop;//定义一个新的事件循环QTimer::singleShot(msec, loop, SLOT(quit()));//创建单次定时器槽函数为事件循环的退出函数loop.exec();//事件循环开始执行程序会卡在这里直到定时时间到本循环被退出
}
4.跨平台延时源码
QTest中的Sleep可以看到window中调到是Sleep其他是nanosleep
void QTest::qSleep(int ms)
{QTEST_ASSERT(ms 0);#ifdef Q_OS_WINSleep(uint(ms));
#elsestruct timespec ts { ms / 1000, (ms % 1000) * 1000 * 1000 };nanosleep(ts, NULL);
#endif
} QThread中Sleep
/* /internalhelper function to do thread sleeps, since usleep()/nanosleep()arent reliable enough (in terms of behavior and availability)
*/
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);
}
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);
}