Moja rada NIGDY nie dziedzicz po QThread! Tu ludzie popełniają strasznie dużo błędów. To powinno wyglądać tak:
class TwojaKlasa : public QObject {
Q_OBJECT
public:
TwojaKlasa(QObject *parent = 0) QObject(parent) { ... }
~TwojaKlasa() { ... }
public slots:
void twojSlot1() {
...
emit czesciowyWynik("tada");
...
emit zrobione();
}
void twojSlot2() {
...
}
public signals:
void czesciowyWynik(const QString& result);
void zrobione();
}
// Gdzieś w kodzie by uruchomić coś w innym wątku:
QThread *thread = new QThread(jakisWlasciciel);
TwojaKlasa *worker = new TwojaKlasa(); // brak parenta jest tutaj obowiązkowy
worker ->moveToThread(thread);
thread->start(); // to tylko uruchamia wątek, który będzie czekał na pracę
connect(button1, SIGNAL(clicked()),
worker, SLOT(twojSlot1()),
Qt::QueuedConnection); // to połączanie będzie zlecało pracę wątkowi
connect(button2, SIGNAL(clicked()),
worker, SLOT(twojSlot2())
Qt::QueuedConnection); // to połączanie będzie zlecało pracę wątkowi
// opcjonalne czyszczenie wątku (poprawione w związku z tym tematem: http://4programmers.net/Forum/C_i_C++/224821-poprawne_zakonczenie_pracy_watku_qthread?p=988200#id988200):
//connect(worker, SIGNAL(destroyed(QObject*)),
// thread, SLOT(quit()));
//connect(thread, SIGNAL(finished()),
// thread, SLOT(deleteLater()));
// do wykonania w jakim slocie
thread->wait();
thread->deleteLater()
Jak to działa? QThread ma event loopa, który czeka na coś do pracy (wątek pozostaje zawieszony - nic nie robi). Gdy leci sygnał do slotu worker
-a, sygnał jest ładnie opakowywany i przesyłany do właściwego wątku (to właśnie robi moveToThread), wątek jest wybudzany i rozpoczyna przetwarzanie właściwego slotu. Jeśli więcej sygnałów zostanie wysłanych do obiektów w tym samym wątku, to są one kolejkowanie (idealne dla komunikacji sieciowej).
Cały pattern upraszcza proces komunikacji między wątkami.
Poza tym masz QThreadPool, który jest prosty w użyciu (nadaje się do zlecenia pojedynczej pracy), oraz freamework w przestrzeni nazw QtConcurrent do przetwarzanie kolekcji danych w wielu wątkach.