Qt: zatrzymanie programu aż wyemituje sygnał i wykona się slot, pobieranie tagów ID3 Phonon

0

Witam,
Pracuje z biblioteką Phonon będącą cześcią Qt.

Chciałbym zapytać czy mogę zrobić następującą rzecz:

  • zatrzymać program aż zostanie wyemiitowany sygnał i zakończy się funkcja slotu, która jest powiązana z tym sygnałem.

Myślę o tym w następującej kategorii:

  • wstawiam w kodzie miejsce, w którym inforumuje kompilator, że kod ma czekać aż obiekt wyemituje sygnał i wykona slot.

Mam pewną funkcję, w której są obiekty klasy Phonon::MediaObject mogące przechowywać informacje o tagach ID3. Informacje te mogą być pobrane dopiero, gdy obiekt będzie gotowy, a gdy obiekt jest gotowy to emituje sygnał meta_information_changed.

Ponieważ chcę pobierać ID3 dla więcej niż 1 pliku jednocześnie chcę dać trochę czasu MediaObject, w tym celu tymczasowo powstrzymać iterowanie po tagach (w pętli foreach, Phonon jest asynchroniczny).

void MainWindow::addFiles()
{
    QStringList files = QFileDialog::getOpenFileNames(this, tr("Add music files to the library"));

    if(files.empty()) return;

    // z zmiennej file przechowywana jest nazwa pliku
    // z ktorego odczytac chce meta dane
    foreach(QString string, files) {
      //  QMessageBox::information(this, "string", string);
        information_resolver = new Phonon::MediaObject(this);
        connect(information_resolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
                SLOT(meta_information_changed(Phonon::State,Phonon::State)));
        information_resolver->setCurrentSource(string);
        // w tym momencie obiekt klasy Phonon::MediaObject information_resolver (wskaznik)
        // za jakis czas emituje sygnal meta_information_changed(Phonon::State newState, Phonon::State oldState)
        // i zaczyna wykonywac odpowiednia funkcje


       // zatrzymaj program az wykona sie slot po emisji sygnalu meta_information_changed

    }
}

void MainWindow::meta_information_changed(Phonon::State newState, Phonon::State oldState)
{
    if (newState == Phonon::ErrorState) {
        QMessageBox::warning(this, tr("Error opening files"), "Error");
        return;
    }
    // get metadata
    QStringList Title, Artist, Album, Genre, Year, Comment;
    Title = information_resolver->metaData("TITLE");
    Artist = information_resolver->metaData("ARTIST");
    Album = information_resolver->metaData("ALBUM");
    Genre = information_resolver->metaData("GENRE");
    Year = information_resolver->metaData("YEAR");
    QMessageBox::information(this, "Title", Title.join(" "));
    
    // niszcze obiekt, bo jest asynchroniczny, a chce po prostu
    // wypelnic go na nowo przy pobieraniu metadanych z nastepnego utworu
    // i nie przejmowac sie sygnalami / slotami przy czysczeniu kolejki
    information_resolver->~MediaObject();
}

Chyba, że polecicie zabrać się za to inaczej?

Dziękuje za uwagę!

0

Google sie zepsuło? Wystarczy wpisać (google nawet podpowiada): qt wait for signal
i w pierszym linku masz rozwiazanie: http://www.developer.nokia.com/Community/Wiki/How_to_wait_synchronously_for_a_Signal_in_Qt

Po opisie problemu nie rozumiem po co tak kombinujesz

Na dodatek tak sie nie niszczy obiektów w c++, gdzie delete? Pamięć ci cieknie (w pewnym sensie).

0

Dzięki za krytykę: zawsze się czegoś nauczę.

QEventLoop rozwiązało mój problem z dodawaniem tagów: mogłem wpisać dobre hasło do google, fault. Działa to dokładnie tak jak chciałem.

Ogólnie to Qt ma podobno garbage collector dla obiektów, które dziedziczą z QEvent. Co ja tam robiłem? Tworzyłem obiekt na stercie. Czy wykonanie delete obiekt wywoła jego destruktor domyślny?

Pozdrawiam,

0

Pierwsze słyszę o garbage collectorze w Qt.Pewnie miałeś na myśli atrybut widgeta Qt::WA_DeleteOnClose.

0

http://www.qtforum.org/article/33410/garbage-collection.html

Tutaj to opisują, miałem na myśli że jak klasa zawiera derektywę Q_OBJECT to posprzata się sama tak jak garbage collector Javy (bo w zasadzie czym to się różni od garbage collectora w nowocześniejszych językach, poza tym że nie jest narzucone od góry i dotyczy konkretnych klas?).

0

z tego co się orientuję, to nie jest „jak garbage collector Javy”, tylko po prostu automatyczna destrukcja obiektów będących polami klasy – tak jakby w destruktorze były odpowiednie delete niejawnie dodane.

Pola z Q_OBJECT zachowują się zatem tak jakby nie były wskaźnikami.

Bardziej to przypomina C++-owe niszczenie obiektów na stosie gdy wypadają z zasięgu, niż prawdziwego GC.

0

po prostu relacja rodzic-dziecko, gdy rodzić jest usuwany to również wszystkie jego dzieci.
Wszystkie QObject'y mają parametr w konstruktorze, który pozwala określić rodzica (ty dałeś this).
Jeśli nie nadajesz rodzica to musisz ręcznie usunąć obiekt.
W kodzie na górze jest błąd, bo tworzysz Phonon::MediaObjec tyle razy ile masz plików i istnieją one tak długo, aż nie zniszczysz okna (this), a potrzebujesz je tylko raz do odczytania tagów..

0

Dzięki za wyjaśnienie.

Czyli jak wykonam delete na tych obiektach MediaObject to usunę je trwale?

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