[Interest] question for a blocking background thread call
coroberti
coroberti at gmail.com
Wed Oct 21 21:00:13 CEST 2020
Dear Elvis,
It's very nice.
Thanks a lot.
Kind regards,
Robert
On Wed, Oct 21, 2020 at 9:53 PM Elvis Stansvik <elvstone at gmail.com> wrote:
>
> Den ons 21 okt. 2020 kl 09:08 skrev coroberti <coroberti at 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 <elvstone at gmail.com> wrote:
> > >
> > > Den ons 21 okt. 2020 02:39Scott Bloom <scott at 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-bounces at qt-project.org> On Behalf Of Thiago Macieira
> > >> Sent: Tuesday, October 20, 2020 3:44 PM
> > >> To: interest at 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 at qt-project.org
> > >> https://lists.qt-project.org/listinfo/interest
> > >> _______________________________________________
> > >> Interest mailing list
> > >> Interest at qt-project.org
> > >> https://lists.qt-project.org/listinfo/interest
> > >
> > > _______________________________________________
> > > Interest mailing list
> > > Interest at qt-project.org
> > > https://lists.qt-project.org/listinfo/interest
More information about the Interest
mailing list