diff options
author | Janek Bevendorff <janek@jbev.net> | 2017-12-17 16:49:46 +0300 |
---|---|---|
committer | Jonathan White <support@dmapps.us> | 2018-01-13 22:23:27 +0300 |
commit | d00ccd2eb5016dec4be962385e61d5bccd606ce1 (patch) | |
tree | 264eb1fb1d30c7ddbdc8bcda345269d259104331 /src/core | |
parent | 0d6ca0945bf1425decf5516420fe3973743e47ab (diff) |
Add AsyncTask helper functions
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/AsyncTask.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/core/AsyncTask.h b/src/core/AsyncTask.h new file mode 100644 index 000000000..67cab1609 --- /dev/null +++ b/src/core/AsyncTask.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KEEPASSXC_ASYNCTASK_HPP +#define KEEPASSXC_ASYNCTASK_HPP + +#include <QFuture> +#include <QFutureWatcher> +#include <QtConcurrent> + + +/** + * Asynchronously run computations outside the GUI thread. + */ +namespace AsyncTask +{ + +/** + * Wait for the given future without blocking the event loop. + * + * @param future future to wait for + * @return async task result + */ +template<typename FunctionObject> +typename std::result_of<FunctionObject()>::type waitForFuture(QFuture<typename std::result_of<FunctionObject()>::type> future) +{ + QEventLoop loop; + QFutureWatcher<typename std::result_of<FunctionObject()>::type> watcher; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + watcher.setFuture(future); + loop.exec(); + return future.result(); +} + +/** + * Run a given task and wait for it to finish without blocking the event loop. + * + * @param task std::function object to run + * @return async task result + */ +template<typename FunctionObject> +typename std::result_of<FunctionObject()>::type runAndWaitForFuture(FunctionObject task) +{ + return waitForFuture<FunctionObject>(QtConcurrent::run(task)); +} + +}; // namespace AsyncTask + +#endif //KEEPASSXC_ASYNCTASK_HPP |