如何从另一个线程停止正在运行的线程?

时间:2016-08-22 11:40:55

标签: multithreading qt signals-slots qthread

我想设置一个Stop按钮来停止除主线程之外的所有线程。为了做到这一点,这些代码如下所示:

serialclass *obje = new serialclass();
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   QThread *thread = new QThread();
   obje->moveToThread(thread);
   connect(this,SIGNAL(signal_stop()),obje,SLOT(stop_thread()),Qt::UniqueConnection);                                                    
   thread->start();
}

void MainWindow::on_pushButton_baslat_clicked() //başlat butonu
{
    connect(this,SIGNAL(signal()),obje,SLOT(function1()), Qt::UniqueConnection);
    emit signal();
}

void MainWindow::on_pushButton_stop_clicked()
{
   qDebug()<<QThread::currentThreadId()<<"=current thread(main thread)";
   emit signal_stop();

}

在SerialClass部分:

void serialclass::function1()

{
    int i;
    for(i=0;i<99999;i++)
    {
        qDebug()<<i;
    }
}

void serialclass::stop_thread()
{
    qDebug()<<QThread::currentThreadId()<<"Serial thread";
    QThread::currentThread()->exit();
}

现在,当我按下启动按钮时,everthing工作正常。但是,当我按下启动按钮并且我在执行function1运行时按下停止按钮时,程序崩溃。

如果我使用睡眠功能而不是退出,首先,在睡眠功能启动后,function1结束。

我必须做什么才能在他们工作时阻止子线程。我的意思是我不想等待他们的过程。想要停止

1 个答案:

答案 0 :(得分:0)

如果您在重新实现的线程中忙于循环,则应使用QThread::isInterruptionRequested()突破循环并立即从run()函数返回:

void serialclass::function1() {
  while (! thread()->isInterruptionRequested())
    msleep(10);
}

如果您为其事件循环使用QThread作为原样,则需要调用其quit()方法。

将其分解出来:

void stop(QThread * thread) {
  thread->requestInterruption();
  thread->quit();
}

您在function1()中所做的事情是错误的。你永远不应该以这种方式阻止线程。您以伪同步方式编写代码。反转控制流以始终在事件循环中保持控制,然后QThread::quit()将按预期工作。