Russian Qt Forum
Ноябрь 27, 2024, 08:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFutureWatcher  (Прочитано 7442 раз)
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 можно не отправлять, да и при попытке собрать один из примеров компилятор дико ругается и выдаёт 43 ошибки.
использую QT Creator 4.7 32-bit
Заранее благодарен за ответы.
« Последнее редактирование: Октябрь 01, 2010, 11:22 от daspisch » Записан
zenden
Гость
« Ответ #1 : Сентябрь 30, 2010, 17:32 »

ну а что ты хотел , если вызываешь watcher.waitForFinished();
Функция transferValue2Base() завершает работу или нет?
Записан
daspisch
Гость
« Ответ #2 : Сентябрь 30, 2010, 17:36 »

нет, пробовал в дэбаг консоль писатьв  начале и в конце - в начале пишет в конце нет. та же история если заменить вывод в дэбаг на мессэджбоксы.
Записан
Rcus
Гость
« Ответ #3 : Сентябрь 30, 2010, 18:09 »

А как насчет минимального проекта воспроизводящего проблему, потому что, скорее всего, проблему нужно искать в коде, которого здесь нет.
Записан
zenden
Гость
« Ответ #4 : Сентябрь 30, 2010, 19:28 »

нет, пробовал в дэбаг консоль писатьв  начале и в конце - в начале пишет в конце нет. та же история если заменить вывод в дэбаг на мессэджбоксы.

ну значит ищи причину, из-за которой ф-ия transferValue2Base() не завершает свою работу, QFutureWatcher тут ни при чем
Записан
daspisch
Гость
« Ответ #5 : Октябрь 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%. Пока буду копать дальше, но может кто подскажет что дельное?
« Последнее редактирование: Октябрь 01, 2010, 10:54 от daspisch » Записан
Kolobok
Гость
« Ответ #6 : Октябрь 01, 2010, 10:58 »

А если так сделать...
Код:
void transferValue2Base(const QString &values)
Записан
daspisch
Гость
« Ответ #7 : Октябрь 01, 2010, 11:09 »

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

Что-то сейчас подсказывает что обрабатывая в 2 потока информацию программа просто забывает один, последний, раз увеличить значение Value у QProgressDialog, т.к. QFutureWatcher уже закончил свою работу. Надо проверить
Записан
Kolobok
Гость
« Ответ #8 : Октябрь 01, 2010, 11:16 »

Я хотел тебе показать, что параметром функции transferValue2Base(...) должен быть элемент контейнера dataList. А у тебя это не так.
Записан
daspisch
Гость
« Ответ #9 : Октябрь 01, 2010, 11:22 »

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

хмм... QFutureWatcher вообще не останавливается... сигнала finished я так и не дождался от него, хотя весь dataList пройден и обработан
« Последнее редактирование: Октябрь 01, 2010, 11:28 от daspisch » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 21.