Qtconcurrent - 从 gui 线程启动第二个线程的简单方法
Qtconcurrent - Easy way to start a second thread from gui thread
我想找到一种简单的方法来从我的应用程序的主 gui 线程开始一个冗长的操作。我有他的出口商对象,不隶属于任何线程。
void closeExporter()
{
// Run closing of object in a different thread:
QFuture<void> future = QtConcurrent::run([=]()
{
m_pExporter->close();
});
while (!future.isFinished())
{
QApplication::processEvents();
// QThread::msleep(0);
qDebug() << "waiting!";
}
}
我没有使用 waitForFinished() 函数,它会阻止任何我的 gui 线程变得无响应。它在一段时间内工作正常,调试打印停止,我的应用程序仍然没有响应。有人知道为什么会这样吗?
我认为,您应该使用 QFutureWatcher
作为可能的实现。下面的小例子说明了用法。
#include <QApplication>
#include <QFrame>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QThread>
#include <QObject>
#include <QFutureWatcher>
#include <QMessageBox>
#include <QtConcurrent>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
auto frame = new QFrame;
frame->setLayout(new QHBoxLayout);
auto btn = new QPushButton("Start Thread");
frame->layout()->addWidget(btn);
QThread::currentThread()->setObjectName("Main Thread");
QFutureWatcher<void> watcher;
QObject::connect(&watcher, &QFutureWatcher<void>::finished, [frame,btn]() {
QMessageBox::information(frame, "Done", QThread::currentThread()->objectName(), QMessageBox::StandardButton::Ok);
btn->setEnabled(true);
});
QObject::connect(btn, &QPushButton::clicked, [btn,&watcher](){
QFuture<void> future = QtConcurrent::run([]() {
QThread::msleep(6000);
qDebug() << QThread::currentThread()->objectName();
});
watcher.setFuture(future);
btn->setDisabled(true);
});
frame->show();
return a.exec();
}
毕竟原始代码工作正常。抱歉浪费你的时间。
我想找到一种简单的方法来从我的应用程序的主 gui 线程开始一个冗长的操作。我有他的出口商对象,不隶属于任何线程。
void closeExporter()
{
// Run closing of object in a different thread:
QFuture<void> future = QtConcurrent::run([=]()
{
m_pExporter->close();
});
while (!future.isFinished())
{
QApplication::processEvents();
// QThread::msleep(0);
qDebug() << "waiting!";
}
}
我没有使用 waitForFinished() 函数,它会阻止任何我的 gui 线程变得无响应。它在一段时间内工作正常,调试打印停止,我的应用程序仍然没有响应。有人知道为什么会这样吗?
我认为,您应该使用 QFutureWatcher
作为可能的实现。下面的小例子说明了用法。
#include <QApplication>
#include <QFrame>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QThread>
#include <QObject>
#include <QFutureWatcher>
#include <QMessageBox>
#include <QtConcurrent>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
auto frame = new QFrame;
frame->setLayout(new QHBoxLayout);
auto btn = new QPushButton("Start Thread");
frame->layout()->addWidget(btn);
QThread::currentThread()->setObjectName("Main Thread");
QFutureWatcher<void> watcher;
QObject::connect(&watcher, &QFutureWatcher<void>::finished, [frame,btn]() {
QMessageBox::information(frame, "Done", QThread::currentThread()->objectName(), QMessageBox::StandardButton::Ok);
btn->setEnabled(true);
});
QObject::connect(btn, &QPushButton::clicked, [btn,&watcher](){
QFuture<void> future = QtConcurrent::run([]() {
QThread::msleep(6000);
qDebug() << QThread::currentThread()->objectName();
});
watcher.setFuture(future);
btn->setDisabled(true);
});
frame->show();
return a.exec();
}
毕竟原始代码工作正常。抱歉浪费你的时间。