从工人暂停/恢复Qthread

时间:2015-11-08 07:27:17

标签: c++ qt qthread

在Worker类中,我有两个工作和控制线程的函数,start()和abort()

void Worker::requestWork()
{
    mutex.lock();
    _working = true;
    _abort = false;
    qDebug()<<"Le thread travail de"<<this->myId<<" "<<thread()->currentThreadId();
    mutex.unlock();
   emit workRequested();
}

void Worker::abort()
{
    mutex.lock();
    if(_working) {
       _abort = true;
       qDebug()<<"Le thread "<<thread()->currentThreadId()<<" s'arrete";
    }
    mutex.unlock();
}

正如您所看到的,workrequest发出一个信号,告诉线程开始工作。并且因为工作者类在线程中,我如何暂停或恢复它?来自工人阶级?来自MainWindow?

现在整个代码.Mainwindow类。

    MainWindow::MainWindow(QWidget *parent) :    
    QMainWindow(parent),    
    ui(new Ui::MainWindow)    
    {    
        ui->setupUi(this);
        QObject::connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(command(QString)));
        thread = new QThread();
        worker = new Worker();
        worker->moveToThread(thread);
        connect(worker, SIGNAL(valueChanged(QString)), ui->label,  SLOT(setText(QString)));
        connect(worker, SIGNAL(workRequested()), thread, SLOT(start()));
        connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
        connect(worker, SIGNAL(finished()), thread, SLOT(quit()), Qt::DirectConnection);
     }

//QLineEdit send signal to slot "command" permit to control the thread
void MainWindow::command(QString text){
qDebug()<<"le message a bien ete intercepte";
qDebug()<<ui->lineEdit->text();
if (text.contains("help"))
    qDebug()<<"heeeelp";
if (text.contains("pause")){
     worker->Paused();
     if(thread->isRunning()){}
         //cond.wait()
}

if (text.contains("restart")){
    worker->Restarted();
    if (!thread->isRunning()){}
        //cond.wakeAll();
}

if (text.contains("stopped")){
    worker->Paused();
    thread->wait();
}
if (text.contains("start")){
    worker->requestWork();

}

if (text.contains("destroyed")){
    worker->destroyed();
}

}

所以我的问题是:当用户插入&#34;暂停&#34;时,如何从命令()槽中暂停和重启线程。 ?

1 个答案:

答案 0 :(得分:1)

我认为你搞砸了使用QThread工作的两种可能方式:

  • 一个是将一个对象(Worker)移动到start() ed QThread。这样你通过调用Worker上的插槽来工作,工作在插槽执行时完成。 您暂停/恢复 - 当广告位完成后,QThread将等待新工作,就像QApplication在闲置时等待事件一样。

  • 第二种方法是继承QThread,重新实现run()并在那里创建(某种)Worker。使用这种方式,您必须创建&#34;工作队列&#34;与你的状态变量类似的东西(_working,_done,wait conditions等),因为如果线程离开run(),线程将退出,你必须自己暂停/恢复