Warum ist QThread::finished signal nicht emittiert werden?

Habe ich mein eigenes erstellt TestService läuft auf einem separaten QThread, aber wenn die MainLoop beendet die QThread::finished signal nicht ausgegeben. Ich sah eine ähnliche Frage, aber das problem war etwas anders da, weil der OP war eine überlastung QThread während ich bewege einfach meine Klasse zu dem thread.

Beachten Sie, dass ich nicht überlasten die QThread Klasse, ich kann nur überlastung QObject basierend auf diesem Beispiel: http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

Hier ist mein TestService Klasse:

#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <iostream>

using namespace std;
class TestService: public QObject
{
    Q_OBJECT;
private:
    volatile int _count;
    QWaitCondition _monitor;
    QMutex _mutex;
    QThread* _thread;

public:
    TestService(int numSeconds)
    {
        _count = numSeconds;
        _thread = NULL;
        cout << "TestService()" << endl;
    }

    virtual ~TestService()
    {
        cout << "~TestService()" << endl;
    }

    void Start()
    {
        QMutexLocker locker(&_mutex);
        if(_thread == NULL)
        {
            _thread = new QThread;

            //Move this service to a new thread
            this->moveToThread(_thread);

            //The main loop will be executed when the thread
            //signals that it has started.
            connect(_thread, SIGNAL(started()), this, SLOT(MainLoop()));

            //Make sure that we notify ourselves when the thread
            //is finished in order to correctly clean-up the thread.
            connect(_thread, SIGNAL(finished()), this, SLOT(OnFinished()));

            //The thread will quit when the sercives
            //signals that it's finished.
            connect(this, SIGNAL(Finished()), _thread, SLOT(quit()));

            //The thread will be scheduled for deletion when the 
            //service signals that it's finished
            connect(this, SIGNAL(Finished()), _thread, SLOT(deleteLater()));

            //Start the thread
            _thread->start();
        }
    }

    void Stop()
    {
        _count = 0;
        _monitor.wakeAll();
    }
private slots:
    void MainLoop()
    {
        cout << "MainLoop() Entered" << endl;
        while(_count > 0)
        {
            cout << "T minus " << _count << " seconds." << endl;

            QMutexLocker locker(&_mutex);
            _monitor.wait(&_mutex, 1000);
            _count--;
        }
        cout << "MainLoop() Finished" << endl;
        emit Finished();
    }

    virtual void OnFinished()
    {
        cout << "OnFinished()" << endl;
    }
signals:
    void Finished();
};

Hier ist der Test-code:

void ServiceTest()
{
    cout << "Press q to quit." << endl;
    cout << "Press s to start." << endl;
    cout << "Press t to stop." << endl;
    QSharedPointer<TestService> testService(new TestService(10));
    char in = 'a';
    while( in != 'q' )
    {
        switch(tolower(in))
        {
        case 's':
            testService->Start();
            break;
        case 't':
            testService->Stop();
            break;
        default:
            break;
        }
        cin.get(in);
        in = tolower(in);
    }
}

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

    ServiceTest();

    QTimer::singleShot(0, &a, SLOT(quit()));

    return a.exec();
}

Ausgabe:

Press q to quit.
Press s to start.
Press t to stop.
TestService()
s
MainLoop() Entered
T minus 10 seconds.
T minus 9 seconds.
T minus 8 seconds.
t
MainLoop() Finished
q
~TestService()
Press any key to continue . . .

Kann jemand erklären, warum ist finished nicht ausgestoßen, wie ich es beheben kann?

InformationsquelleAutor Kiril | 2012-11-19
Schreibe einen Kommentar