Mam wątpliwości, w jaki sposób powinienem użyć QEventLoop
. Mam 2 kawałki kodu, oba działają dla mnie (pobierz pobrany zasób sieciowy).Właściwe użycie QEventLoop
Pierwszy:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
manager->get(request) ;
QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
loop.exec();
drugie jeden:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
manager->get(request) ;
QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
loop.exec();
Co chcę wiedzieć, który z nich powinno się używać. Mam na myśli, czy pętla zdarzeń kończy się w drugiej po wyzwoleniu sygnału? Czy muszę zadzwonić pod numer quit()
jak w pierwszym? Drugie rozwiązanie znalazłem gdzieś, ale nie wydawało mi się to właściwe, więc zmodyfikowałem go na pierwszy kawałek kodu.
Jak chcesz przerwać pętlę zdarzeń w drugim przypadku? Najpierw jest OK, ale powinieneś też radzić sobie z błędami. –
Tak, właśnie o tym wiedziałem, więc go zmieniłem. Po prostu nie byłam pewna, czy dobrze się zastanawiałam, więc zapytałam: –
Ogólnie nie powinieneś używać - QApplication już tworzy pętlę zdarzeń dla głównego wątku, a QThread ustawia pętlę zdarzeń dla wątków w tle. – MrEricSir