Domanda

Sto cercando di eseguire un po 'di lavoro in un thread separato e fermare quel thread quando il lavoro è finito.

Ho impostato una connessione come questa

thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );

Ma lo slot Quit () non viene mai chiamato quando emetto il segnale finito (). La riga di comando non mostra alcun avvertimento relativo alle connessioni fallite.

Ho creato un semplice progetto di test per restringere il problema e ho lo stesso comportamento:

Testclass.h:

#ifndef TESTCLASS_H
#define TESTCLASS_H
class TestClass : public QObject
{
    Q_OBJECT
public:
    TestClass() { }
signals:
    void finished();
public slots:
    void doWork();
}
#endif // TESTCLASS_H

Testclass.cpp:

#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
    qDebug() << "Starting";
    for( long i = 0; i < 1000000000; i++ );
    qDebug() << "Done";
    emit finished();
};

e il main.cpp:

#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include "TestClass.h"

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

    TestClass testClass;
    QThread testThread;

    testClass.moveToThread( &testThread );

    testThread.connect( &testClass, SIGNAL( finished() ), SLOT( quit() ) );
    testClass.connect( &testThread, SIGNAL( started() ), SLOT( doWork() ) );

    testThread.start();
    testThread.wait();

    return 0;
}

Quindi ecco cosa mi aspettavo che accadesse:

  1. Una volta testThread.start() viene elaborato, il thread run() la funzione viene chiamata, che chiama internamente exec() e inizia un ciclo di eventi. Inoltre lancia un started() segnale.
  2. testClassha il suo doWork() slot chiamato.
  3. quando TestClass::doWork() è fatto, lancia un file finished() segnale.
  4. Il ciclo dell'evento di testThread riceve il segnale e lo inoltra al suo quit() fessura
  5. testThread.wait() ritorna dall'attesa mentre il thread è terminato.

Passaggi 1-3 funzionano e ottengo il qDebug() produzione. Il problema è al passaggio 4: il segnale viene sparato e inoltrato ad un ciclo di eventi (l'ho debug un po ', ma non sono riuscito a capire quale ciclo di eventi è stato licenziato) ma il quit() Lo slot non viene mai chiamato.

Che cosa sto facendo di sbagliato?

PS: Per favore, non suggerire invece la sottoclasse QThread, l'intero punto di me che provo questa via d'uscita è perché voglio evitare la sottoclasse QThread.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top