Название: QFutureWatcher Отправлено: daspisch от Сентябрь 30, 2010, 17:13 некоторые проблемы с данным классом, а именно:
запускаю его примерно таким образом: Код: watcher.setFuture(QtConcurrent::map(dataList, transferValue2Base)); Код: void transferValue2Base(const QStringList &values) Код: 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) Код: 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 А если так сделать... мне нужен именно список значений, их там 3 изначально(но в дальнейшем может и измениться)Код: void transferValue2Base(const QString &values) сейчас я передаю ему 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 пройден и обработан |