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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Остановка рекурсии поиска файлов [РЕШЕНО]  (Прочитано 26109 раз)
daimon
Гость
« Ответ #15 : Март 13, 2012, 14:30 »

Цитировать
QStringList listFiles = QStringList();   // какой в этом скрытый смысл ?

все переменные нужно иниционализировать)), хотя можно и убрать
Записан
mutineer
Гость
« Ответ #16 : Март 13, 2012, 14:31 »

Цитировать
QStringList listFiles = QStringList();   // какой в этом скрытый смысл ?

все переменные нужно иниционализировать)), хотя можно и убрать

Лист сам инициализируется в своем конструкторе. А так у тебя создается и удаляется лишний объект
Записан
daimon
Гость
« Ответ #17 : Март 13, 2012, 14:37 »

Цитировать
QStringList listFiles = QStringList();   // какой в этом скрытый смысл ?

все переменные нужно иниционализировать)), хотя можно и убрать

Лист сам инициализируется в своем конструкторе. А так у тебя создается и удаляется лишний объект

согласен
Записан
daimon
Гость
« Ответ #18 : Март 13, 2012, 14:40 »

вопрос по архитектуре использования потока такого.

что лучше:

1. создать поток один раз и просто чередовать функции start, terminate (своя функция, меняет флаг для останова рекурсии)
     плюс - один раз выделил память и работать с одним потоком,
     минус - если поток не используется, висит в памяти, только одна ветка поиска файлов
2. создавать каждый раз извне (где он используется) и после отработки рекурсии делать deleteLater() и также в terminate (моя функция)  вызывать удаление потока deleteLater(),
    плюс - в памяти не висит просто так, можно запустить независимые ветки поиска файлов,
    минус - время на выделение памяти при создании ветки

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Март 13, 2012, 14:50 »

вопрос по архитектуре использования потока такого.

что лучше:
В таких случаях лучше спросить (самого себя) "а их может быть 2 или больше?". Напр где-то началось (одно) сканирование, а в др месте потребовалось еще одно (напр с др фолдером). Если такая ситуевина планируется, то второй вариант 
Записан
V1KT0P
Гость
« Ответ #20 : Март 13, 2012, 15:05 »

подробнее пожалуйста..
Да чего подробнее то, вот на скорую руку переписал, но не проверял правильность.
Код:
QStringList getListFilesFind(const QString &pathr, QStringList filters)
{
    QStack<QString> dirs;
    QString path;
    QStringList listFiles;
    if(pathr.isEmpty())
        path = QDir::currentPath();
    else
        path = pathr;
    dirs.push(path);
    while (!dirs.isEmpty()) {
        path = dirs.pop();
        QDir dir(path);
        if(!dir.exists())
            continue;

        foreach (QString file, dir.entryList(filters))
            listFiles << QFileInfo(dir, file).absoluteFilePath();

        foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
            dirs.push(path + QDir::separator() + subDir);
        }
    }
    return listFiles;
}
Записан
daimon
Гость
« Ответ #21 : Март 13, 2012, 15:47 »

подробнее пожалуйста..
Да чего подробнее то, вот на скорую руку переписал, но не проверял правильность.
Код:
QStringList getListFilesFind(const QString &pathr, QStringList filters)
{
    QStack<QString> dirs;
    QString path;
    QStringList listFiles;
    if(pathr.isEmpty())
        path = QDir::currentPath();
    else
        path = pathr;
    dirs.push(path);
    while (!dirs.isEmpty()) {
        path = dirs.pop();
        QDir dir(path);
        if(!dir.exists())
            continue;

        foreach (QString file, dir.entryList(filters))
            listFiles << QFileInfo(dir, file).absoluteFilePath();

        foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
            dirs.push(path + QDir::separator() + subDir);
        }
    }
    return listFiles;
}

работать работает, но вот непонятно чего так

Код
C++ (Qt)
m_countFiles+= dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot).count();
 
foreach (QString file, dir.entryList(filters))
{
m_currentNumberFile ++;
emit progress(m_currentNumberFile *100 / m_countFiles);
listFiles << QFileInfo(dir, file).absoluteFilePath();
}

доходит до 100% за 10 сек, хотя поиску ещё идёт как минимум 3 минуты, при моём рекурсивном варианте поиска прогресс менялся и бывало 96 97 98 и аж в конце 100
что не так?
Записан
V1KT0P
Гость
« Ответ #22 : Март 13, 2012, 15:59 »

подробнее пожалуйста..
Да чего подробнее то, вот на скорую руку переписал, но не проверял правильность.
Код:
QStringList getListFilesFind(const QString &pathr, QStringList filters)
{
    QStack<QString> dirs;
    QString path;
    QStringList listFiles;
    if(pathr.isEmpty())
        path = QDir::currentPath();
    else
        path = pathr;
    dirs.push(path);
    while (!dirs.isEmpty()) {
        path = dirs.pop();
        QDir dir(path);
        if(!dir.exists())
            continue;

        foreach (QString file, dir.entryList(filters))
            listFiles << QFileInfo(dir, file).absoluteFilePath();

        foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
            dirs.push(path + QDir::separator() + subDir);
        }
    }
    return listFiles;
}

работать работает, но вот непонятно чего так

Код
C++ (Qt)
m_countFiles+= dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot).count();
 
foreach (QString file, dir.entryList(filters))
{
m_currentNumberFile ++;
emit progress(m_currentNumberFile *100 / m_countFiles);
listFiles << QFileInfo(dir, file).absoluteFilePath();
}

доходит до 100% за 10 сек, хотя поиску ещё идёт как минимум 3 минуты, при моём рекурсивном варианте поиска прогресс менялся и бывало 96 97 98 и аж в конце 100
что не так?
Ну дык ты же подсчитываешь количество директорий. В твоем рекурсивном после нахождения каждой директории в ней происходил поиск и поэтому время между нахождением следующей директории был долгий. В моем же варианте сразу все директории верхнего уровня находятся и если вложенных директорий нет то и будет 100%. Щас набросаю как я это вижу...
Записан
daimon
Гость
« Ответ #23 : Март 13, 2012, 16:02 »

я поправил

Код
C++ (Qt)
m_countFiles += dir.entryList(filters).count();

чтобы плюсовать количество файлов по фильтру именно текущей директории

но всё равно 99-100 100-99
Записан
V1KT0P
Гость
« Ответ #24 : Март 13, 2012, 16:09 »

я поправил

Код
C++ (Qt)
m_countFiles += dir.entryList(filters).count();

чтобы плюсовать количество файлов по фильтру именно текущей директории

но всё равно 99-100 100-99
Вот это попробуй, вроде должно работать, но прогресс будет иногда уменьшатся когда будет происходить нахождение новых файлов:
Код:
QStringList getListFilesFind(const QString &pathr, QStringList filters)
{
    QStack<QString> dirs;
    QString path;
    QStringList listFiles;
    qint32 countFiles = 1;
    qint32 currentNumberFile = 0;
    qint32 progress = 0;
    qint32 progressOld = 0;
    if(pathr.isEmpty())
        path = QDir::currentPath();
    else
        path = pathr;
    dirs.push(path);
    while (!dirs.isEmpty()) {
        path = dirs.pop();
        QDir dir(path);
        countFiles += dir.entryList(QDir::NoDotAndDotDot).count();
        ++currentNumberFile;
        if(!dir.exists())
            continue;

        foreach (QString file, dir.entryList(filters)) {
            ++currentNumberFile;
            listFiles << QFileInfo(dir, file).absoluteFilePath();
            progress = currentNumberFile * 100 / countFiles;
            if (progressOld != progress) {
                progressOld = progress;
                emit progress(progress);
            }
        }

        foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
            dirs.push(path + QDir::separator() + subDir);
        }
    }
    return listFiles;
}
Записан
daimon
Гость
« Ответ #25 : Март 13, 2012, 16:21 »

по нулям всё, emit не идёт
Записан
V1KT0P
Гость
« Ответ #26 : Март 13, 2012, 16:24 »

по нулям всё, emit не идёт
Да ступил, вместо
Код:
countFiles += dir.entryList(QDir::NoDotAndDotDot).count();
надо было
Код:
countFiles += dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot).count();
Записан
daimon
Гость
« Ответ #27 : Март 13, 2012, 16:30 »

по нулям всё, emit не идёт
Да ступил, вместо
Код:
countFiles += dir.entryList(QDir::NoDotAndDotDot).count();
надо было
Код:
countFiles += dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot).count();

всё равно не так, попытаюсь объяснить, так мы считаем количество всех файлов в папке, а текущий номер файла идёт по списку количества файлов в директории по фильтру, итог один - прогресс всегда показывает 30-40%

думаю нужно написать countFiles += dir.entryList(filters).count();

и всё равно всегда 100%
мда сурово

видимо прийдёться поставить прогресбар на анимацию))))
« Последнее редактирование: Март 13, 2012, 16:32 от daimon » Записан
V1KT0P
Гость
« Ответ #28 : Март 13, 2012, 16:33 »

по нулям всё, emit не идёт
Да ступил, вместо
Код:
countFiles += dir.entryList(QDir::NoDotAndDotDot).count();
надо было
Код:
countFiles += dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot).count();

всё равно не так, попытаюсь объяснить, так мы считаем количество всех файлов в папке, а текущий номер файла идёт по списку количества файлов в директории по фильтру, итог один - прогресс всегда показывает 30-40%

думаю нужно написать countFiles += dir.entryList(filters).count();

и всё равно всегда 100%
мда сурово
Дело в том что по мере поиска количество файлов увеличивается и изначально мы не знаем сколько их. Вот последний вариант, больше я не хочу пробовать:
Код:
QStringList getListFilesFind(const QString &pathr, QStringList filters)
{
    QStack<QString> dirs;
    QString path;
    QStringList listFiles;
    qint32 countFiles = 1;
    qint32 currentNumberFile = 0;
    qint32 progress = 0;
    qint32 progressOld = 0;
    if(pathr.isEmpty())
        path = QDir::currentPath();
    else
        path = pathr;
    dirs.push(path);
    while (!dirs.isEmpty()) {
        path = dirs.pop();
        QDir dir(path);
        countFiles += dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot).count();
        ++currentNumberFile;

        progress = currentNumberFile * 100 / countFiles;
        if (progressOld != progress) {
            progressOld = progress;
            emit progress(progress);
        }

        if(!dir.exists())
            continue;

        foreach (QString file, dir.entryList(filters)) {
            listFiles << QFileInfo(dir, file).absoluteFilePath();
        }

        foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
            dirs.push(path + QDir::separator() + subDir);
        }
    }
    return listFiles;
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Март 13, 2012, 16:37 »

entryList явно не дешевый вызов и делать его дважды-трижды не следует
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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