Wstrzymywanie wykonywania pętli.

0

Mam funkcję, która wywołuje QNetworkRequest, z tym, że chciałbym wywoływać w pętli.
Napisałem taki kod:

 connect(d, &Downloader::finished, this, &MainWindow::doDownload_Finished);

        for (unsigned int i = 0; i< favoriteChannelsList.size(); i++){
            currentChannel = favoriteChannelsList[i];
            d->doDownload(currentChannel);
        }

Ta pętla działa mi dobrze, tzn wywołuje doDownload_Finished() tak jak trzeba.
Chciałbym wykorzystać zmienną currentChannel w każdym wywołaniu doDownload_Finished().
No i tu zaczynają się schody, gdyż currentChannel zmienia się bardzo szybko nie czekając, aż doDownload_Finished() zakończy się, no i na końcu okazuje się, że pomimo iż wywołanie d->doDownload(currentChannel); przyjmuje za każdym obiegiem pętli inną wartość, to już dla każdego wywołania doDownload_Finished() currentChannel ma ostatnią przypisaną wartość.

Nie jestem pewien w jaki sposób najlepiej rozwiązać ten problem. Myślałem o wstrzymaniu wykonywania pętli dopóki nie zakończy się wykonywanie doDownload_Finished(), to było by chyba najprostsze rozwiązanie, ale nie wiem jak to zapisać. A może w jakiś inny sposób lepiej to rozwiązać?

0

Jak na razie rozwiązałem to w ten sposób:

void MainWindow::on_checkBox_toggled(bool checked)
{
    if (checked)
    {
         connect(d, &Downloader::downloaderFinished, this, &MainWindow::doDownload_Finished_MultiChannel);
 
        for (unsigned int i = 0; i< favoriteChannelsList.size(); i++){
            currentChannel = favoriteChannelsList[i];
            d->doDownload(currentChannel);
        }
        QEventLoop loop;
        connect(this, SIGNAL(finished()), &loop, SLOT(quit()));
        connect(this, &MainWindow::finished, &loop, &QEventLoop::quit);
        loop.exec();
    }
}

void MainWindow::doDownload_Finished_MultiChannel()
{
    //ciało funkcji
    emit finished();
}

Jednak nie wiem, czy to najszczęśliwsze rozwiązanie.

2

Przekazuj currentChannel w sygnale i slocie.

Kawałki kodu które wklejasz nie wydają się mieć wzajemnie powiązania.

0

Ja już chciałem kombinować coś z własnymi sygnałami, ale ciężko mi z tego kodu wydedukować dokładnie o co chodzi, tj jeśli funkcja doDownload_Finished zakończy działanie to wysyłasz jakiś sygnał który odblokuje pętlę.

0

Błędem jest ten ciąg wywołań funkcji? Bo się pogubiłem. Ciąg tych wywołań działa tak jak to zaprogramowałeś, więc jeśli to jest błędem to musisz przeprojektować kod.

1

Bez wiedzy czym jest currentChannel i jak wygląda Downloader trudno ci pomóc.
Na razie można powiedzieć tylko tyle ile napisał ci @kq , bez istotnych detali nic więcej sensownego nie dostaniesz.
Radzę jednak zacząć od opisania jaką funkcjonalność realizujesz, by było wiadomo, czy przypadkiem nie zszedłeś na złą drogę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1