Russian Qt Forum

Qt => Общие вопросы => Тема начата: daspisch от Сентябрь 30, 2010, 17:13



Название: QFutureWatcher
Отправлено: daspisch от Сентябрь 30, 2010, 17:13
некоторые проблемы с данным классом, а именно:
запускаю его примерно таким образом:
Код:
watcher.setFuture(QtConcurrent::map(dataList, transferValue2Base));

watcher.waitForFinished();
где dataList это QList<QStringList> а transferValue2Base функция вида:
Код:
void transferValue2Base(const QStringList &values)
сам watcher объявлен до этого так:
Код:
QFutureWatcher<void> watcher;

Функция запускается(причём с переданными значениями и почти сразу же программа намертво зависает в том числе и цикл отрисовки, и в итоге вываливается с предложение завершить зависшую программу.

Читать ассистента по поводу QFutureWatcher Class Reference (http://doc.qt.nokia.com/4.6/qfuturewatcher.html) можно не отправлять, да и при попытке собрать один из примеров (http://doc.trolltech.com/4.5/qtconcurrent-progressdialog-main-cpp.html) компилятор дико ругается и выдаёт 43 ошибки.
использую QT Creator 4.7 32-bit
Заранее благодарен за ответы.


Название: Re: QFutureWatcher
Отправлено: zenden от Сентябрь 30, 2010, 17:32
ну а что ты хотел , если вызываешь watcher.waitForFinished();
Функция transferValue2Base() завершает работу или нет?


Название: Re: QFutureWatcher
Отправлено: daspisch от Сентябрь 30, 2010, 17:36
нет, пробовал в дэбаг консоль писатьв  начале и в конце - в начале пишет в конце нет. та же история если заменить вывод в дэбаг на мессэджбоксы.


Название: Re: QFutureWatcher
Отправлено: Rcus от Сентябрь 30, 2010, 18:09
А как насчет минимального проекта воспроизводящего проблему, потому что, скорее всего, проблему нужно искать в коде, которого здесь нет.


Название: Re: QFutureWatcher
Отправлено: zenden от Сентябрь 30, 2010, 19:28
нет, пробовал в дэбаг консоль писатьв  начале и в конце - в начале пишет в конце нет. та же история если заменить вывод в дэбаг на мессэджбоксы.

ну значит ищи причину, из-за которой ф-ия transferValue2Base() не завершает свою работу, QFutureWatcher тут ни при чем


Название: Re: QFutureWatcher
Отправлено: daspisch от Октябрь 01, 2010, 08:07
 да я её даже пустой уже оставлял, ничего не помогает. там всего то 1 sql-запрос с предварительным формированием его из QStringList

---менее минуты назад---
В итоге заставил работать такого вида вотчер:
Код:
    QFutureWatcher<void> futureWatcher;
и такого вида функцию:
Код:
void transferValue2Base(QStringList &iteration)
{
    logDigger digger(query);

    digger.loadLogFile(iteration.value(0), iteration.value(1), iteration.value(2));
}
вотчер призываю к работе так:
Код:
futureWatcher.setFuture(QtConcurrent::map(dataList, transferValue2Base));
после чего показываю прогресс диалог:
Код:
dialog.exec();

То ли где-то заданы неправильные минимальные и максимальные значения, то ли ещё что, но при добавлении нескольких записей таким методом после добавления последней вотчер останавливается а прогресс дайалог так и висит на 98%. Пока буду копать дальше, но может кто подскажет что дельное?


Название: Re: QFutureWatcher
Отправлено: Kolobok от Октябрь 01, 2010, 10:58
А если так сделать...
Код:
void transferValue2Base(const QString &values)


Название: Re: QFutureWatcher
Отправлено: daspisch от Октябрь 01, 2010, 11:09
А если так сделать...
Код:
void transferValue2Base(const QString &values)
мне нужен именно список значений, их там 3 изначально(но в дальнейшем может и измениться)
сейчас я передаю ему QList с QStringList-ами в качестве объектов и сообтветственно обрабатываю их через итератор получаемый с помощью QtConcurrent::map.

Что-то сейчас подсказывает что обрабатывая в 2 потока информацию программа просто забывает один, последний, раз увеличить значение Value у QProgressDialog, т.к. QFutureWatcher уже закончил свою работу. Надо проверить


Название: Re: QFutureWatcher
Отправлено: Kolobok от Октябрь 01, 2010, 11:16
Я хотел тебе показать, что параметром функции transferValue2Base(...) должен быть элемент контейнера dataList. А у тебя это не так.


Название: Re: QFutureWatcher
Отправлено: daspisch от Октябрь 01, 2010, 11:22
Я хотел тебе показать, что параметром функции transferValue2Base(...) должен быть элемент контейнера dataList. А у тебя это не так.
простите, я ввёл вас в заблуждение.
Код:
QList<QStringList> dataList;
в первом посте опечатка, сейчас исправлю

хмм... QFutureWatcher вообще не останавливается... сигнала finished я так и не дождался от него, хотя весь dataList пройден и обработан