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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProgressDialog для обратобки рекурсии.  (Прочитано 3003 раз)
KuZ
Гость
« : Май 08, 2010, 22:15 »

Есть функция которая реализует алгоритм "волновой алгоритм", у меня в программе используется для выхода из лабиринта, но это не столь важно.
Код:
runAlgorithm(unsigned int x, unsigned int y, double val)
{
    // vecMap - QVector< QVector<double> >  - сама карта;
    // x,y - координаты начала волны.
    // val - значение инициализации волны(по умолчанию 0 );
    qApp->processEvents();
    vecMap[x][y] = val;
    if(vecMap[x-1][y] == Enums::EXIT || vecMap[x+1][y] == Enums::EXIT || vecMap[x][y-1] == Enums::EXIT || vecMap[x][y+1] == Enums::EXIT )
    {
        pathFinded = val;
        return;
    }
    if(vecMap[x-1][y] == Enums::EMPTY || vecMap[x-1][y] > val+1)
        runAlgorithm(x-1,y,val+1);
    if(vecMap[x][y-1] == Enums::EMPTY || vecMap[x][y-1] > val+1)
        runAlgorithm(x,y-1,val+1);
    if(vecMap[x+1][y] == Enums::EMPTY || vecMap[x+1][y] > val+1)
        runAlgorithm(x+1,y,val+1);
    if(vecMap[x][y+1] == Enums::EMPTY || vecMap[x][y+1] > val+1)
        runAlgorithm(x,y+1,val+1);
}
Каким образом возможно отобразить с помощью QProgressDialog пока обрабатывается сама функция, поле может быть достаточно большое на которое требуется время(примерно 100х100 обрабатывает 40 сек). Сама проблема заключается в определении точки конца(100%) и как его вообще с рекурсией связать.
upd 1: Модно конечно сделать чтоб просто надпись была "подождите..." , но я думаю пользователю намного познавательней будет когда будет видно сколько осталось %. Или каким может быть другим способом можно сделать, приму любую идею. 
« Последнее редактирование: Май 08, 2010, 22:43 от KuZ » Записан
garryHotDog
Гость
« Ответ #1 : Май 09, 2010, 07:29 »

попробуй вот этот виджет, вместо прогресс диалога - http://qt-apps.org/content/show.php/QProgressIndicator?content=115762, очень прост в использовании!!
Записан
ufna
Гость
« Ответ #2 : Май 09, 2010, 08:35 »

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

Для более оптимальных результатов этот метод можно и нужно оптимизировать (к примеру, не стоит слать кучу сигналов, достаточно раз в n/100 срабатываний).
Записан
KuZ
Гость
« Ответ #3 : Май 09, 2010, 09:59 »

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

Для более оптимальных результатов этот метод можно и нужно оптимизировать (к примеру, не стоит слать кучу сигналов, достаточно раз в n/100 срабатываний).
Понял. Только  проблема не знаю как определять сложность алгоритма, если можешь скинь несколько ссылок если есть, где доходчиво объясняется как определить. (Пошел гуглить)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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