Qt: запуск обратного вызова в основном потоке из рабочего потокаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Qt: запуск обратного вызова в основном потоке из рабочего потока

Сообщение Anonymous »

Предположим, у меня есть следующий асинхронный исполнитель задач. Он ставит задачи в очередь и выполняет их одну за другой, вызывая лямбды по завершении. Если func возвращает результат какого-то типа, то обратный вызов onComplete должен получить аргумент того же типа.

Код: Выделить всё

class TaskRunner
{
public:
TaskRunner() :
mPool(new QThreadPool())
{
mPool->setMaxThreadCount(1);
mPool->setExpiryTimeout(-1);
}
public:
// For Funcs returning an instance of std::variant
template 
std::enable_if_t
async(Func func, OnComplete onComplete, OnError onError, Args... args)
{
QMutexLocker lock(&mutex);
(void)QtConcurrent::run(mPool.get(), [=]() {
const auto result = func(args...);
if (result.index() == 0)
onComplete(std::get(result));
else
onError(std::get(result));
});
}
// ... similar templates for std::optional, etc. ...
private:
QScopedPointer mPool;
QMutex mutex;
};
Использование:

Код: Выделить всё

TaskRunner runner;
runner.async([](int a, int b) {
if(b != 0)
return a/b;
else
return std::string("division by zero");},
[](auto result){ std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78248509/qt-running-callback-in-the-main-thread-from-the-worker-thread[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»