gpt4 book ai didi

c++ - 从 Worker 暂停/恢复 Qthread

转载 作者:行者123 更新时间:2023-11-28 05:59:15 28 4
gpt4 key购买 nike

在 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();
}

如您所见,工作请求发出一个信号,告诉线程开始工作。而且因为 Worker 类在线程中,我该如何暂停或恢复它?来自 worker 类(Class)?从主窗口?

现在是整个代码.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() 插槽暂停和重新启动线程?

最佳答案

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

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

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

关于c++ - 从 Worker 暂停/恢复 Qthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591705/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com