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】:这通常是不可能的。一些QFuture
s——不是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