QT 의 sleep
Qt 에서 Sleep 을 제공 하지 않 았 습 니 다.
포럼 에서 때때로 어떤 사람 이 묻는다.
이러한 문 제 는 사실 한 가지 로 요약 된다.메 인 스 레 드 에서 이러한 함 수 를 사용 하 는 것 은 잘못된 것 이다.이것 은 인터페이스 가 새로 고침 되 지 못 하고 사용자 와 프로그램 이 상호작용 을 할 수 없다.
Qt 가 제공 하지 않 는 것 은 주 스 레 드 에서 sleep 함 수 를 사용 할 필요 가 없 기 때 문 입 니 다.
어떻게 프로그램 을 한동안 기다 리 게 합 니까?
QTime
QTime t;
t.start();
while(t.elapsed()<1000);
이런 순환 도 흔히 볼 수 있 는 잘못된 용법 이다.그러나 정확 한 것 으로 바 꾸 는 것 은 비교적 간단 하 다.
QTime t;
t.start();
while(t.elapsed()<1000)
QCoreApplication::processEvents();
프로그램 이 응답 할 수 있 도록 이 벤트 를 끊임없이 처리 합 니 다.
QElapsedTimer
Qt 4.7 에 도 입 된 새로운 클래스 로 QTime 에 비해 elapsed 시간 을 더 빨리 계산 하 는 방법 을 제공 합 니 다.
QElapsedTimer t;
t.start();
while(t.elapsed()<1000)
QCoreApplication::processEvents();
QTest::qWait
QTest 모듈 에서 제공 하 는 대기 함수 입 니 다.
다음은 소스 코드 입 니 다.
namespace QTest
{
inline static void qWait(int ms)
{
Q_ASSERT(QCoreApplication::instance());
QElapsedTimer timer;
timer.start();
do {
QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
QTest::qSleep(10);
} while (timer.elapsed() < ms);
}
...
사실 마력 은 없 지,그렇지?그러나 QTest 모듈 이기 때문에 프로그램 에서 사용 하지 않 습 니 다.
QEventLoop
QTimer 에 맞 춰 부분 적 인 eventLoop 을 사용 하 는 것 도 좋 은 선택 이다.예:
QEventLoop eventloop;
QTimer::singleShot(100, &eventloop, SLOT(quit()));
eventloop.exec();
QTimer 와 QBasic Timer
이 두 가 지 는 본문 과 직접적인 관계 가 없 기 때문에 QTimer 는 모두 가 잘 알 고 있 을 것 이다.Q Basic Timer 는 사용 하 는 사람 이 별로 없 을 것 으로 보인다.
크로스 플랫폼 sleep
처음부터 우 리 는 이것 이 필요 없다 고 말 했 지만.하지만 어떤 경우 에 도 당신 은 이 물건 이 필요 합 니 다.어떻게 크로스 플랫폼 의 sleep 를 실현 합 니까?
우 리 는 처음에 도 언급 했 듯 이 QThread 류 와 QTest 모듈 은 모두 sleep 함 수 를 제공 했다.사실은 우 리 는 그들의 소스 코드 만 보면 된다.
QTest 모듈 의 함 수 는 매우 간단 합 니 다(windows 에서 Sleep 을 호출 하고 다른 플랫폼 에서 nanosleep 을 호출 합 니 다).
void QTest::qSleep(int ms)
{
QTEST_ASSERT(ms > 0);
#ifdef Q_OS_WIN
Sleep(uint(ms));
#else
struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
nanosleep(&ts, NULL);
#endif
}
QThread 의 원본 코드 를 보면 windows 에서 도 Sleep 을 직접 호출 하지만 windows 가 아 닌 실현 은 이것 보다 훨씬 복잡 합 니 다.
/* \internal
helper 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);
} :http://hi.baidu.com/cyclone/blog/item/9c7f8701ef7326c3267fb515.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
양식 제출 후 제출 버튼 비활성화텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.