crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

RazrFalcon
  опции профиля:
сообщение 14.3.2012, 15:13
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я нашел/знаю 2-а способа.
1-й:
    QDirIterator dirIt("/path",QDirIterator::Subdirectories);
    while (dirIt.hasNext()) {
        dirIt.next();
        if (QFileInfo(dirIt.filePath()).isFile() && !QFileInfo(dirIt.filePath()).isSymLink())
            if (QFileInfo(dirIt.filePath()).suffix().contains(filter)) // расширение файла
                fileList.append(dirIt.filePath()); // fileList это QFileInfoList
    }

2-й:
// найдено в доках Qt
QFileInfoList MainWindow::loadFiles(const QString &startDir, QStringList filters)
{
    QDir dir(startDir);
    QFileInfoList list;

    foreach (QString file, dir.entryList(filters, QDir::Files))
        list += QFileInfo(startDir + "/" + file);

    foreach (QString subdir, dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot))
        list += loadFiles(startDir + "/" + subdir, filters);
    return list;
}

Вопрос в том: какой быстрее, теоретически. Так как на практике замерить очень сложно. После первого раза ОС все это кеширует и уже в 100500 раз быстрее происходит поиск. И вот эти "быстрые" времена - почти идентичны. А вот сразу после перезагрузки выигрывает второй способ, как минимум у меня.
Задача понять какой быстрее - и его и использовать.

Сообщение отредактировал RazrFalcon - 14.3.2012, 15:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 5)
Авварон
  опции профиля:
сообщение 14.3.2012, 16:05
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

Спасибо сказали: 14 раз(а)




Репутация:   0  


Цитата
QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
SortFlags sort) const
{
const QDirPrivate* d = d_ptr.constData();

if (filters == NoFilter)
filters = d->filters;
#ifdef QT3_SUPPORT
if (d->matchAllDirs)
filters |= AllDirs;
#endif
if (sort == NoSort)
sort = d->sort;

if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
d->initFileLists(*this);
return d->files;
}

QFileInfoList l;
QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
while (it.hasNext()) {
it.next();
l.append(it.fileInfo());
}
QStringList ret;
d->sortFileList(sort, l, &ret, 0);
return ret;
}

Я ответил на вопрос?
А первый способ у вас тормозит потому что в сто раз создаете файл инфо для одного объекта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 14.3.2012, 18:35
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


То есть второй способ в любом случае будет быстрее?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 15.3.2012, 23:51
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну и в тему.
Поиск все равно довольно долгий - решил вынести в отдельный поток через QtConcurrent.
Делаю:
QFuture<QFileInfoList> future = QtConcurrent::run(&MainWindow::files, QString("/path"));
future.waitForFinished();
fileList = future.result();

А гуи все равно зависает на время поиска, но не должен же! <_<
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 16.3.2012, 2:27
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


Цитата(RazrFalcon @ 16.3.2012, 5:51) *
Ну и в тему.
Поиск все равно довольно долгий - решил вынести в отдельный поток через QtConcurrent.
Делаю:
QFuture<QFileInfoList> future = QtConcurrent::run(&MainWindow::files, QString("/path"));
future.waitForFinished();
fileList = future.result();

А гуи все равно зависает на время поиска, но не должен же! <_<


Похоже из-за waitForFinished() и замораживается гуй
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 16.3.2012, 14:38
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Та не. Без него так же.
Походу проще через moveToThread уже сделать <_<
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 20.6.2025, 17:59