Den ons 21 okt. 2020 kl 09:08 skrev coroberti <corobe...@gmail.com>: > > Elvis and Scott, > Could you please provide a code sample?
I can't show our actual code since it's proprietary, but here's an example: example.cpp: #include <QApplication> #include <QPushButton> #include <QProgressDialog> #include <QMessageBox> #include <QtConcurrentRun> #include <QFuture> #include <QFutureWatcher> class TaskButton : public QPushButton { Q_OBJECT public: void startTask() { auto progressDialog = new QProgressDialog("Exporting...", QString(), 0, 10, this); progressDialog->setWindowModality(Qt::WindowModal); progressDialog->setAttribute(Qt::WA_DeleteOnClose); progressDialog->show(); auto future = QtConcurrent::run(this, &TaskButton::task); auto watcher = new QFutureWatcher<void>(this); connect(this, &TaskButton::progressChanged, progressDialog, &QProgressDialog::setValue); connect(watcher, &QFutureWatcher<void>::finished, watcher, &QFutureWatcher<void>::deleteLater); connect(watcher, &QFutureWatcher<void>::finished, progressDialog, &QProgressDialog::close); connect(watcher, &QFutureWatcher<void>::finished, this, &TaskButton::finished); watcher->setFuture(future); } void task() { for (int progress = 1; progress < 11; ++progress) { QThread::sleep(1); // Heavy task emit progressChanged(progress); } } signals: void progressChanged(int progress); void finished(); }; int main(int argc, char *argv[]) { QApplication app(argc, argv); TaskButton button; button.setText("Start Task"); button.show(); QObject::connect(&button, &QPushButton::clicked, &button, &TaskButton::startTask); QObject::connect(&button, &TaskButton::finished, [&]() { QMessageBox::information(&button, "Finished!", "We're done!"); app.quit(); }); return app.exec(); } #include "example.moc" example.pro: TEMPLATE = app QT += widgets concurrent TARGET = example INCLUDEPATH += . DEFINES += QT_DEPRECATED_WARNINGS SOURCES += example.cpp HTH, Elvis > > Thanks, > > Kind regards, > Robert > > On Wed, Oct 21, 2020 at 9:51 AM Elvis Stansvik <elvst...@gmail.com> wrote: > > > > Den ons 21 okt. 2020 02:39Scott Bloom <sc...@towel42.com> skrev: > >> > >> Well. I 100% totally overthought this... and was able to implement this in > >> about 10 lines of code using a derivation of QProgressDIalog + QtConcurrent > >> > >> The progress dialog, is run with windowModality set to Qt::WindowModal, > >> > >> I overload exec, and launch the function then call QProgressDialog::exec. > >> > >> Works like charm. Thanks for the advice. > > > > > > Just to chime in: This is also the approach we've taken to some long > > running operations in our application, and it has also worked out fine. > > > > Elvis > > > >> > >> Scott > >> -----Original Message----- > >> From: Interest <interest-boun...@qt-project.org> On Behalf Of Thiago > >> Macieira > >> Sent: Tuesday, October 20, 2020 3:44 PM > >> To: interest@qt-project.org > >> Subject: Re: [Interest] question for a blocking background thread call > >> > >> On Tuesday, 20 October 2020 14:26:10 PDT Giuseppe D'Angelo via Interest > >> wrote: > >> > Can't you just create a QDialog and exec() it? > >> > >> Or any other modal window in front. You probably want to display either a > >> progress bar or a distraction, to let your users know that the application > >> isn't frozen. > >> > >> -- > >> Thiago Macieira - thiago.macieira (AT) intel.com > >> Software Architect - Intel DPG Cloud Engineering > >> > >> > >> > >> _______________________________________________ > >> Interest mailing list > >> Interest@qt-project.org > >> https://lists.qt-project.org/listinfo/interest > >> _______________________________________________ > >> Interest mailing list > >> Interest@qt-project.org > >> https://lists.qt-project.org/listinfo/interest > > > > _______________________________________________ > > Interest mailing list > > Interest@qt-project.org > > https://lists.qt-project.org/listinfo/interest _______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest