【问题标题】:How to stop a running thread from another thread?如何从另一个线程停止正在运行的线程?
【发布时间】:2023-10-03 04:41:01
【问题描述】:

我想放一个停止按钮来停止除主线程之外的所有线程。为此,编写了如下代码:

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

现在,当我按下启动按钮时,一切正常。但是,当我按下启动按钮并在功能 1 运行时按下停止按钮时,程序崩溃。

如果我使用睡眠功能而不是退出,首先 function1 结束,然后睡眠功能开始。

当子线程工作时我必须做些什么来停止子线程。我的意思是我不想等待他们的过程。想停下来

【问题讨论】:

  • 您有一些processEvents 调用还是在function1 中使用本地事件循环?
  • 我编辑了function1。让我们说这样的话。 99999 显示后,stop_threads 正在调用
  • 其实我不知道什么是事件进程或事件循环。
  • 感谢您的评论我把 qApp->processEvents();它有效:)
  • 不要那样做。这是自找麻烦。

标签: multithreading qt signals-slots qthread


【解决方案1】:

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

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

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

将其分解:

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

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

【讨论】:

  • 此方法有效,谢谢您的回复,但我想问另一个问题。 requestinterruption() 函数后如何继续线程?启动功能不起作用。
  • 您需要提出一个单独的问题。 start() 通常有效:)
  • 是的 start() 函数有效。我犯了一个错误。谢谢你:)
最近更新 更多