網(wǎng)站正能量免費推廣軟件晚上推廣的渠道和方法有哪些
目錄
QT提供延時
1.自定義延時
2.使用QElapsedTimer
3.使用事件循環(huán)
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);
}
傳入?yún)?shù)msec,使程序延時msec毫秒。這種方法不會阻塞當前線程,尤其適合Qt的單線程帶UI程序,或者UI線程,因為線程阻塞時,
很明顯的現(xiàn)象就是UI卡死。當然,你也可以更改addMSecs為addSecs使程序延時msec秒。
如果去掉QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 可以延時,但也會阻塞線程
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
使程序在while等待期間,去處理一下本線程的事件循環(huán),處理事件循環(huán)最多100ms必須返回本語句,如果提前處理完畢,則立即返回這條語句
2.使用QElapsedTimer
使程序延時10S(10000MS),但是這種方法也會阻塞線程
//#include <QElapsedTimer>
QElapsedTimer t;
t.start();
while(t.elapsed()<10000);
3.使用事件循環(huán)
這種方法不會阻塞線程
void Delay_MSec(unsigned int msec)
{QEventLoop loop;//定義一個新的事件循環(huán)QTimer::singleShot(msec, &loop, SLOT(quit()));//創(chuàng)建單次定時器,槽函數(shù)為事件循環(huán)的退出函數(shù)loop.exec();//事件循環(huán)開始執(zhí)行,程序會卡在這里,直到定時時間到,本循環(huán)被退出
}
4.跨平臺延時源碼
QTest中的Sleep(可以看到window中調(diào)到是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()aren't 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);
}