Qt - Wątki


(Kamiljano) #1

mój wątek wygląda na razie następująco

#include 

#include 

class threads : public QThread

{

public:

    virtual void run();


};


void threads::run()

{

    QMessageBox::information(0,"asdf","sdafa", QMessageBox::Ok);

}

natomiast plik, który go wywołuje wygląda tak:

int main(int argc, char *argv[])

{   

    QApplication a(argc, argv);

    lang.load_language();

    MainWindow mainwindow;

    threads th;

    th.start();

    mainwindow.show();

    return a.exec();

}

z jakichś względów, kiedy tylko wywołuję metodę start(), program kończy działanie… Dlaczego tak się dzieje? jestem pewny, że nie ma błędów w żadnym innym pliku projektu, to musi leżeć gdzieś tutaj, ale nigdy wcześniej nie bawiłem się w wątki przy użyciu Qt i nie wiem jak to zrobić…


(Marek Konitz) #2

Przyznam, że nie robiłem nic w Qt, ale na moje to brakuje konstruktora, po prostu odwołujesz się do nieutworzonego obiektu.

threads th;

th = new threads();

th.start();


(Kamiljano) #3

pozwolę sobie pominąć fakt, że nie masz obeznania ze wskaźnikami… ale przy wskaźnikach i z operatorem new też próbowałem i i tak nie śmigało…


(Marek Konitz) #4

Tia, jeżeli chodzi Ci o *th, to fakt nie zwróciłem uwagi - trochę za dużo Javy i C# ostatnio :wink: Zresztą nie spieram się - ostatnio C++ uż ywam jedynie zachowawczo.

Natomiast nie jestem pewien, czy QMessageBox może być używany w innych wątkach niż główny - tu może być problem.


(Kaka') #5

milka89 ,

Rejestrując się na niniejszym forum zobowiązałeś się przestrzegać jego regulaminu. Niestety, w tym momencie łamiesz go nie tytułując poprawnie tematu. Proszę zapoznać się w pierwszej kolejności z regulaminem forum, a następnie z tym tematem. Po zapoznaniu się proszę poprawić tytuł tematu, używając przycisku zmien.gif


(Hausner15) #6

Hmm sam programuję w QT, ale nie miałem jeszcze okazji chwytać się za wątki.

Z tego co widzę tu i w dokumentacji to bardzo możliwe że brak makra Q_OBJECT w definicji klasy jest problemem.

Głowy nie dam, jak pisałem wcześniej za wątki się nie chwytałem bo nie były mi potrzebne, ale spróbuj i napisz czy pomogło :slight_smile:

Pozdrawiam.


(matiit) #7

Cytat z dokumentacji: “…all GUI operation can be done only in main thread.”

Więc musisz zmienić podejście, musisz zatrzymać wątek (ten poboczny) i wysłać sygnał do slotu w wątku głównym, nawet może sygnałem być (chyba) QMetaObject::invokeMethod utworzony aby narysował messageboxa))