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
?
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'. –
nie zdawałem sobie sprawy, że to metoda statyczna. dzięki. –