2015-01-20 4 views
0

Я пытаюсь реализовать поточный рабочий для параллельного вычисления. Проблема, с которой я столкнулся, заключается в том, что слот quit()thread не запускается, поэтому приложения ждут while(thread->isRunning()). Можно ли остановить thread от worker, используя соединение сигналов между ними? Вот мой код:Возможно ли, чтобы работник остановил свою собственную нить с сигналом/слотом в Qt?

main.cpp:

#include <QCoreApplication> 
#include "workermanager.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WorkerManager workerManager; 
    workerManager.process(); 
    return a.exec(); 
} 

worker.h:

#include <QObject> 
#include <QDebug> 

class Worker : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Worker(QObject *parent = 0) : 
     QObject(parent){} 

signals: 
    void processingFinished(); 

public slots: 
    void process() 
    { 
     qDebug() << "processing"; 
     emit this->processingFinished(); 
    } 
}; 

workermanager.h:

#include "worker.h" 
#include <QThread> 

class WorkerManager : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit WorkerManager(QObject *parent = 0) : 
     QObject(parent){} 

    void process() 
    { 
     QThread* thread = new QThread; 
     Worker* worker = new Worker; 

     connect(thread,SIGNAL(started()),worker,SLOT(process())); 
     connect(worker,SIGNAL(processingFinished()),thread,SLOT(quit())); 

     worker->moveToThread(thread); 
     thread->start(); 
     qDebug() << "thread started"; 
     while(thread->isRunning()) 
     { 
     } 
     qDebug() << "thread finished"; 

     //further operations - e.g. data collection from workers etc. 

    } 
}; 
+0

Непонятно, как вы ожидаете, что это сработает, учитывая, что ваша текущая реализация является синхронной. Вы намерены, чтобы «WorkerManager» жил на своем собственном потоке? Если это так, то он может просто запустить цикл событий для этого потока. – sjdowling

+1

'worker' живет в рабочем потоке, а' thread' живет в основном потоке, поэтому сигнал 'processingFinished' будет отправлен через по очереди соединение. Следовательно, слот 'quit' будет вызываться контуром события основного потока, но цикл событий не обрабатывается в вашем цикле' while'. – Oktalist

ответ

0

что в то время как блоки петли ваш поток и предотвращает его от обработки каких-либо сигналов, если вы действительно хотите ждать завершения потока, вам нужно, чтобы начать цикл событий.

Попробуйте вместо этого:

void process() 
{ 
    QThread* thread = new QThread; 
    Worker* worker = new Worker; 

    connect(thread,SIGNAL(started()),worker,SLOT(process())); 
    connect(worker,SIGNAL(processingFinished()),thread,SLOT(quit())); 

    worker->moveToThread(thread); 

    QEventLoop loop; 
    connect(thread, &QThread::finished, &loop, &QEventLoop::quit); 
    qDebug() << "thread started"; 
    thread->start(); 
    loop.exec(); 
    qDebug() << "thread finished"; 

    //further operations - e.g. data collection from workers etc. 

} 

Но я должен признать, что я не вижу смысла этого кода. Если вам нужно дождаться завершения задачи, чтобы продолжать делать вещи, вы можете запустить ее напрямую. Там, по крайней мере, ваша программа сможет обрабатывать другие вещи (если есть) в среднем.

 Смежные вопросы

  • Нет связанных вопросов^_^