2016-08-29 5 views
1

Die Run-Methode von meinem QThread ist fertig, aber ich kann das Signal nicht bekommen. HierMein QThread fertig, aber ich kann das Signal nicht

ist der gesamte Code:

Mein Thread-Header:

#ifndef MYTHREAD_H 
#define MYTHREAD_H 

#include <QThread> 
#include <QDebug> 

#include "mydataobject.h" 

class MyThread: public QThread 
{ 
    Q_OBJECT 
public: 
    MyThread(MyDataObject data, 
      bool useData); 

private: 
    void run(); 

signals: 
    void resultsReady(MyDataObject data); 

private: 
    MyDataObject data; 
    bool useData; 
}; 

#endif // MYTHREAD_H 

Mein Thread-Code:

#include "mythread.h" 

MyThread::MyThread(MyDataObject data, bool useData) 
{ 
    this->data = data; 
    this->useData = useData; 
} 

void MyThread::run() 
{ 
    if(useData) 
    { 
     data.calculate(); // Do something 
    } 

    emit resultsReady(data); 
    qDebug() << "Thread finished"; 
} 

Mein Test-Header:

#ifndef THREADTESTER_H 
#define THREADTESTER_H 

#include <QDebug> 
#include "mythread.h" 

class ThreadTester: public QObject 
{ 
    Q_OBJECT 
public: 
    ThreadTester(); 
    void runTests(); 

public slots: 
    void threadFinished(MyDataObject data); 

private: 
    MyDataObject data; 
}; 

#endif // THREADTESTER_H 

Mein Testcode :

#include "threadtester.h" 

ThreadTester::ThreadTester(){} 

void ThreadTester::runTests() 
{ 
    qRegisterMetaType<MyDataObject>("MyDataObject"); 

    MyDataObject data; 
    MyThread* thread = new MyThread(data, true); 

    connect(thread, SIGNAL(resultsReady(MyDataObject)), 
      this, SLOT(threadFinished(MyDataObject))); 

    thread->start(); 
    thread->wait(); 
} 

void ThreadTester::threadFinished(MyDataObject data) 
{ 
    qDebug() << "TEST"; 
    this->data = data; 
} 

Hauptfunktion:

#include <QApplication> 

#include "threadtester.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    ThreadTester threadTester; 
    threadTester.runTests(); 

    return a.exec(); 
} 

Warum die öffentliche Schlitz threadFinished nie aufgerufen wird?

Hinweis: Die Meldung "Gewinde beendet" erscheint, aber die Meldung "TEST" nicht.

+0

welche Version q? – Surt

+0

Entschuldigung, ich habe vergessen, diese Information zu setzen. Qt 5.3.2 – KelvinS

+1

Ich wette, Sie haben keine Ereignisschleife. –

Antwort

0

Was im Code passiert:

  1. erstellen QApplication
  2. erstellen ThreadTester
  3. run-Methode ThreadTester::runTests die folgende ist:

    • schafft Profil Objekt
    • verbindenführen Start Thread
    • warten Faden ...
    • jetzt Thread tut es Aufgabe und gibt das Signal
    • da Sie connect Standardverbindungsmethode verwendet, Slot Aufruf soll im Ereignisschleife ausgeführt werden soll, die nicht gestartet noch.
    • Thread beendet
    • ... warten Thread abgeschlossen (wahrscheinlich hier Sie Endergebnis erwartet, aber schauen, was später geschieht)
    • ist
  4. Ereignisschleife gestartet

  5. Ereignisschleife führt Warteschlange Aufruf von Schlitz ThreadTester::threadFinished
  6. Ereignisschleife wartet auf nächste Ereignisse
Verwandte Themen