2013-07-15 16 views
6

Zwykle jeśli używam funkcji intensywnej, mogę zadzwonić pod numer QCoreApplication::processEvents() lub QEventLoop::processEvents(), aby upewnić się, że moje przetwarzanie nie blokuje innych sygnałów i gniazd.Jak przetwarzać zdarzenia na QThread?

Jednakże, jeśli tworzę nową QThread i przenieść pracownicę do tego wątku, to nie mają QCoreApplication lub QEventLoop z którego można zadzwonić processEvents().

Z moich badań, wydaje się, że powinienem być w stanie zainstalować QEventLoop na nowym QThread ja stworzył, a potem mogę zadzwonić processEvents() tego QEventLoop.

Jednak nie mogę wymyślić, jak to zrobić. Myślę, że może wyglądać mniej więcej tak:

QThread *thread = new QThread(this); 
Worker *worker = new Worker(this); 
QEventLoop *loop = new QEventLoop(); 

connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing())); 
connect(worker, SIGNAL(done()), thread, SLOT(quit())); 
connect(worker, SIGNAL(done()), loop, SLOT(quit())); 

worker->moveToThread(thread);  

//loop->exec() // blocks processing of this thread 
loop->moveToThread(thread); 

//loop->exec() // loop is not a member of this thread anymore and even 
       // if it was, this would block the thread from starting 
thread->start(); 
//loop->exec(); // loop is not a member of this thread anymore and even 
       // if it was, this would block this thread from continuing 

Każde miejsce, w którym próbuję uruchomić pętlę, ma jakiś problem. Ale nawet gdyby coś takiego działało, jak nazwałbym processEvents() na tym QEventLoop()?

Alternatywnie QThread posiada również funkcję setEventDispatcher() i QAbstractEventDispatcher ma processEvents() funkcję, ale nie wydaje się znaleźć niczego, co podklasy QAbstractEventDispatcher.

Jaki jest właściwy sposób przetwarzania zdarzeń podczas intensywnej funkcji pracownika na urządzeniu QThread?

Odpowiedz

13

Zgodnie z dokumentacją wywołanie QCoreApplication::processEvents() przetwarza zdarzenia dla dowolnego wątku, który go nazywa.

+2

Ah! Dziękuję Ci! Myślałem, że do użycia 'QCoreApplication :: processEvents()' musiałbym utworzyć nową 'QCoreApplication'. Ale wydaje się, że moje 'QThread' jest nadal częścią istniejącej' QCoreApplication'. –

+0

nie zdawałem sobie sprawy, że to metoda statyczna. dzięki. –

-6

Jednakże, jeśli tworzę nową QThread i przenieść pracownicę do tego wątku, to nie mają QCoreApplication lub QEventLoop z którego można zadzwonić processEvents().

Dokładnie - nie nazywaj tego. Nie potrzebujesz tego, nie chcesz tego.

+3

Więc ... jak mogę przetwarzać zdarzenia na 'QThread'? –

Powiązane problemy