LINUX.ORG.RU

QtConcurrent, finished signal not emitted

 , ,


0

3

После проблем возникших в этой статье, решил попробовать использовать QtConcurrent::run + QFuture + QFutureWatcher

Вполне возможно, что это я неудачник, или же это просто нехватка опыта использования QtConcurrent, но опять же результат разный на Windows и Linux (fedora)

Код:
Запуск потока:

            auto watcher = new QFutureWatcher<ParserTask *>(this);
            QObject::connect(watcher, SIGNAL(finished()), SLOT(taskFinished()));
            //QObject::connect(watcher, SIGNAL(canceled()), SLOT(taskFinished()));
            auto future = QtConcurrent::run(task, &ParserTask::run);
            watcher->setFuture(future);


taskFinished слот:
    void taskFinished() {
        auto watcher = static_cast<QFutureWatcher<ParserTask *> *>(QObject::sender());

        std::cout << "PARSED: "  << watcher->result()->result().size();
    }


Вывод на fedora без строчки «PARSER: *», на винде с этой строчкой

Что я не так делаю и как это исправить?

Вывод на fedora без строчки «PARSER: *», на винде с этой строчкой

Пальцем в небо: почему не qDebug(), а std::cout? Ты мешаешь stl и Qt, это не есть хорошо.

EXL ★★★★★
()
Ответ на: комментарий от EXL

При замене на qDebug() происходит абсолютно то же самое

Flassie
() автор топика

В доке Qt есть пример использования QFuture. Зачем вы костыляете через sender() ?

Ну и это - весь код выложите. Или минимальный компилируемый пример.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Тасков может быть несколько
Судя по докам кьюта используется future.result(), который блокирует текущий поток. Мне этого не нужно
QFutureWatcher же должен эмитить сигнал и, кажется, это вполне нормальный способ получить этот самый QFutureWatcher, чтобы достать из него результат

Flassie
() автор топика
Ответ на: комментарий от RazrFalcon

Ничего не мешает
Результат от этого не меняется. Это было временное решение, чтобы разобраться, как это работает и как это можно использовать

Flassie
() автор топика

А ParserTask::run не успевает у тебя завершиться между

auto future = QtConcurrent::run(task, &ParserTask::run);

и

watcher->setFuture(future);

И вот тут auto future = QtConcurrent::run(task, &ParserTask::run); task - это что?

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от Flassie

task - ParserTask*

Я туплю, или тогда какой из методов вызывается?

QFuture<T> QtConcurrent::run(Function function, ... )

или

QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ... )

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от grondek
template <typename T, typename Class>
QFuture<T> run(const Class *object, T (Class::*fn)() const)
{
    return (new typename SelectStoredConstMemberFunctionPointerCall0<T, Class>::type(fn, object))->start();
}


Я так понимаю этот

Flassie
() автор топика
Ответ на: комментарий от Flassie

А, туплю, я смотрел только по документации ) Не по исходникам.

grondek
()
Ответ на: комментарий от EXL

Вы были очень близки к правильному ответу...
После исправления строчки вывода на

std::cout << "PARSED: "  << watcher->result()->result().size() << std::endl;

всё начало выводиться...

Flassie
() автор топика
Ответ на: комментарий от Flassie

Ага, там еще может быть зависимость от настроек терминала.

grondek
()
Ответ на: комментарий от Flassie

всё начало выводиться...

Кстати, а выводиться начало где? В cmd.exe или в консольке Qt Creator?

EXL ★★★★★
()
Ответ на: комментарий от Flassie

qDebug() же конец строки сам вставляет, почему не сработал?

unC0Rr ★★★★★
()
Ответ на: комментарий от EXL

Пальцем в небо: почему не qDebug(), а std::cout? Ты мешаешь stl и Qt, это не есть хорошо.

Мы в тот раз уже обсуждали, что как бы срать уже.

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.