2014-06-14 4 views
2
bool MainWindow::waitForLoad(QWebView& view) 
{ 
    QEventLoop loopLoad; 
    QTimer timer; 
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &loopLoad, SLOT(quit())); 
    QObject::connect(&timer, SIGNAL(timeout()), &loopLoad, SLOT(quit())); 
    timer.start(timeout); 
    loopLoad.exec(); 
    if(!timer.isActive()) 
    { 
     timer.stop(); 
     view.stop(); 
     return false; 
    } 
    return true; 
} 

나에게 맞는 코드입니까? 응용 프로그램은 때때로 라인QWebView로드 대기

loopLoad.exec(); 

후 정지 그리고 항상 (오류 요법,로드 할 때 타임 아웃 - 항상 true) 몇 가지 문제를 발생에도 여기에 true를 돌려줍니다.

답변

3

start(timeout);은 msec 밀리 초의 제한 시간 간격으로 타이머를 시작합니다. 타이머를 호출 한 후 timer.isActive()은 항상 true를 반환하고 if 블록은 실행되지 않습니다. loadFinished 발행시에

당신은 타이머를 중지해야 : 타이머가 활성화되어

QObject::connect(&view, SIGNAL(loadFinished(bool)), &timer, SLOT(stop())); 

경우 타임 아웃이 발생 되었기 때문에 false를 반환해야하므로 다음 이벤트 루프는 타이머에 의해 중지됩니다. if(!timer.isActive())if(timer.isActive())으로 대체해야합니다.

올바른 코드는 다음과 같습니다

bool MainWindow::waitForLoad(QWebView& view) 
{ 
    QEventLoop loopLoad; 
    QTimer timer; 
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &loopLoad, SLOT(quit())); 
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &timer, SLOT(stop())); 
    QObject::connect(&timer, SIGNAL(timeout()), &loopLoad, SLOT(quit())); 
    timer.start(timeout); 
    loopLoad.exec(); 
    if(timer.isActive()) 
    { 
     timer.stop(); 
     view.stop(); 
     return false; 
    } 

    return true; 
} 
+0

그것은 충돌의 원인이 되었습니까? 아니면 그것이 이유일까요? (나는 로그를 사용했고 모든 버그는 여기에서 발생했다) – BuGiZ400

+0

나는 그것이 충돌의 이유라고 생각하지 않는다. 이 함수를 호출하는 코드의 일부 다른 위치가 원인 일 수 있습니다. – Nejat

+0

버그가없는 ~ 1 시간 테스트하고 있습니다. 고칠 전에 각 ~ 2-5h 일어난. 또한 각 코드 줄을 기록 할 것입니다. loopLoad.exec()에서 버그가 발생했습니다. 문제는 여기에만있는 것 같아서 – BuGiZ400