2009-12-10 16 views
7

Jaki jest właściwy sposób dla głównego wątku GUI do aktualizacji QProgressDialog podczas oczekiwania na QFuture. W szczególności, co się dzieje w tej pętli:Aktualizacja QProgressDialog za pomocą QFuture

QProgressDialog pd(...); 
QFuture f = ...; 

while (!f.isFinished()) { 
    pd.setValue(f.progressValue()); 

    // what goes here? 
} 

Teraz mam sleep(), tak jak rozmowy tam, ale to nie jest optymalny (i oczywiście wprowadza pewne opóźnienie GUI).

Jeśli nic nie położę, główny wątek będzie pętlą pd.setValue(), marnując cykle procesora.

Miałem nadzieję na umieszczenie czegoś takiego jak QCoreApplication :: processEvents (flags, maxtime), ale to natychmiast zwraca, jeśli kolejka zdarzeń jest pusta. Chciałbym wersję, która czeka aż do maxtime lub cokolwiek, nawet jeśli kolejka jest pusta. W ten sposób otrzymuję opóźnienie, a główny wątek jest zawsze gotowy do reagowania na zdarzenia GUI.

Odpowiedz

14

Użyj monitora QFutureWatcher do monitorowania obiektu QFuture za pomocą sygnałów i gniazd.

QFutureWatcher watcher; 
QProgressDialog pd(...); 
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int))); 
QFuture f = ... 
watcher.setFuture(f); 
+0

Świetna odpowiedź TimW. FYI brakuje "&" przed 'watcher' w' connect (watcher, ...); '? – sstock

+0

thx, poprawiono kod – TimW

Powiązane problemy