【发布时间】: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 指南。