QT 의 sleep

6110 단어 직장qtsleep레저

Qt 에서 Sleep 을 제공 하지 않 았 습 니 다.
 
포럼 에서 때때로 어떤 사람 이 묻는다.
  • Qt 는 왜 크로스 플랫폼 의 sleep 함 수 를 제공 하지 않 았 습 니까?
  • 플랫폼 과 관련 된 Sleep 또는 nanosleep 를 사용 한 후에 화면 은 왜 반응 이 없 습 니까?
  • QThread 에서 proctected 권한 을 제공 하 는 sleep 함 수 를 주 스 레 드 에 어떻게 사용 합 니까?
  • QTest 의 qSleep 을 사용 합 니 다.windows 에서 콘 솔 을 어떻게 숨 깁 니까?

  • 이러한 문 제 는 사실 한 가지 로 요약 된다.메 인 스 레 드 에서 이러한 함 수 를 사용 하 는 것 은 잘못된 것 이다.이것 은 인터페이스 가 새로 고침 되 지 못 하고 사용자 와 프로그램 이 상호작용 을 할 수 없다.
    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 는 사용 하 는 사람 이 별로 없 을 것 으로 보인다.
  • QTimer 에 비해 QBasic Timer 가 빠 르 고 가 벼 우 며 밑바닥 이다.
  • QTimer 에 비해 QObject 의 파생 류 가 아 닙 니 다.

  • 크로스 플랫폼 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

    좋은 웹페이지 즐겨찾기