QThreadPool 强制停止在 qt cpp

Posted

技术标签:

【中文标题】QThreadPool 强制停止在 qt cpp【英文标题】:QThreadPool force stop in qt cpp 【发布时间】:2018-03-15 09:31:36 【问题描述】:

我创建了 Qthreadpool 。我想从队列中删除所有任务。代码如下。

void MainWindow::startThread()

   thread= new QThradPool(this);
   thread->setMaxThreadcount(1);
   hello = new HelloWordTask();
   thread->start(hello);

void MainWindow::stopThread()

  thread->clear();
  delete thread;
  delete hello;
  // but current task is not stopping. until it is finished. i want to stop it 
   immediately .

void HelloWordTask::run()

  // function which takes time

【问题讨论】:

【参考方案1】:

这通常是不可能的。一些QFutures——不是QtConcurrent::run返回的那些——是可以取消的。如果您使用QtConcurrent::run,或提交通用QRunnable,则需要将其设为可取消。 This answer 提供了一种生成在线程池上运行的可取消未来的方法。然后,您需要跟踪这些未来并取消任何正在进行的。

一般来说,不需要动态创建线程池——只需按值存储即可。一旦你使用了QFuture 接口,也不需要管理任务的生命周期:future 是这个对象的句柄,一旦最后一个消失,任务对象就会被释放。

class HelloWorldTask : RunControllableTask<void> 
  // see https://***.com/a/16729619/1329652
  ...
;

class MainWindow : public QMainWindow 
  QThreadPool m_pool;
  QVector<QFuture<void>> m_futures;
public:
  explicit MainWindow(QWidget * parent = ) : QMainWindow(parent) 
    m_pool.setMaxThreadCount(1);
  
  void startTask() 
    auto future = TaskExecutor::run(new HelloWorldTask());
    m_futures.push_back(future);
  
  void stopAllTasks() 
    m_pool.cancel();
    for (auto &future : m_futures)
      future.cancel();
    while (!m_futures.isEmpty())
      m_futures.takeLast().waitForFinished(); // this will free the task too!
    Q_ASSERT(!m_pool.activeThreadCount());
  
  ~MainWindow() override 
    stopAllTasks();
  
;

您也可以使用 future 接口从任务中线程安全地返回数据!

【讨论】:

以上是关于QThreadPool 强制停止在 qt cpp的主要内容,如果未能解决你的问题,请参考以下文章

Qt基础之十六:QtConcurrent和QThreadPool

Qt - 一个简单的回显服务器

PySide QtCore.QThreadPool 和 QApplication.quit() 导致挂起?

C++/Qt - QThread 与 QRunnable

在 QThreadPool 中执行槽

QThreadPool maxThreadCount 在 Application 和 DLL 中不同