从 Worker 暂停/恢复 Qthread

Posted

技术标签:

【中文标题】从 Worker 暂停/恢复 Qthread【英文标题】:Pause / resume Qthread from Worker 【发布时间】:2015-11-08 07:27:17 【问题描述】:

在 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 发出一个信号,告诉线程开始工作。又因为 Worker Class 在线程中,如何暂停或恢复呢?来自工人阶级?从主窗口?

现在是整个 code.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();



所以我的问题是:当用户插入“暂停”时,如何从 command() 插槽暂停和重新启动线程?

【问题讨论】:

顺便说一下,关于这个connect(worker, SIGNAL(workRequested()), thread, SLOT(start()));线程本身不在线程中,如果它是在主线程中创建的,那么它属于主线程。 “它不起作用”不是一个合适的描述。另外,提供一个最小但完整的示例。有关详细信息,请参阅 SO 指南。 【参考方案1】:

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

一个是将对象(Worker)移动到start()ed QThread。这样你就可以通过调用 Worker 上的插槽来工作,当插槽执行时,工作就完成了。 您不要暂停/恢复此操作 - 当 slot 完成时,QThread 将等待新的工作,就像 QApplication 在空闲时等待事件一样。

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

【讨论】:

以上是关于从 Worker 暂停/恢复 Qthread的主要内容,如果未能解决你的问题,请参考以下文章

从 iPhone 应用程序暂停/恢复 Pandora

JAVA如何暂停运行,等网络恢复后再从上次的断点处继续运行程序?

NSURLSessionDownloadTask 从其他 View ios 恢复和暂停

Android 应用从 Google Play 暂停,无法恢复

从 cpp 中的父线程暂停和恢复线程

意图恢复先前暂停的活动(从通知中调用)