Russian Qt Forum

Qt => Общие вопросы => Тема начата: KuZ от Май 08, 2010, 22:15



Название: QProgressDialog для обратобки рекурсии.
Отправлено: 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: Модно конечно сделать чтоб просто надпись была "подождите..." , но я думаю пользователю намного познавательней будет когда будет видно сколько осталось %. Или каким может быть другим способом можно сделать, приму любую идею. 


Название: Re: QProgressDialog для обратобки рекурсии.
Отправлено: garryHotDog от Май 09, 2010, 07:29
попробуй вот этот виджет, вместо прогресс диалога - http://qt-apps.org/content/show.php/QProgressIndicator?content=115762, очень прост в использовании!!


Название: Re: QProgressDialog для обратобки рекурсии.
Отправлено: ufna от Май 09, 2010, 08:35
самое простое - берешь сложность алгоритма, считаешь количество шагов в наихудшем случае - это будет максимальный предел прогресс бара. каждый шаг рекурсии и т.п. шлешь сигнал "я отработался", ловишь его в основном потоке и добавляешь к прогресс бару.

Для более оптимальных результатов этот метод можно и нужно оптимизировать (к примеру, не стоит слать кучу сигналов, достаточно раз в n/100 срабатываний).


Название: Re: QProgressDialog для обратобки рекурсии.
Отправлено: KuZ от Май 09, 2010, 09:59
самое простое - берешь сложность алгоритма, считаешь количество шагов в наихудшем случае - это будет максимальный предел прогресс бара. каждый шаг рекурсии и т.п. шлешь сигнал "я отработался", ловишь его в основном потоке и добавляешь к прогресс бару.

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