crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> ускорение или замена QDir.entryList(), как ускорить QDir.entryList()
maric2000
  опции профиля:
сообщение 26.10.2009, 11:00
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 26.10.2009
Пользователь №: 1179

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




Репутация:   0  


В программе требуется для заполнения таблицы многократно в цикле вызывать QDir.entryList(const QStringList & nameFilters) с разными масками файлов. Это требуется для определения числа файлов по определенной маске. Выполнение всего цикла занимает неоправданно много времени (если закомментировать строку с QDir.entryList() , то цикл проходит мгновенно). Подскажите, как ускорить entryList или если для определения числа файлов по определенной маске пользоваться другим классом ( функцией), то каким?
PS. раньше в в аналогичной программе, под С++Builder, пользовался FindFirst, FindNext все работало очень быстро.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.10.2009, 11:06
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(maric2000 @ 26.10.2009, 14:00) *
многократно в цикле вызывать QDir.entryList(const QStringList & nameFilters) с разными масками файлов.
Я бы взял все файлы (без фильтра), а потом этот список бы фильтровал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
niXman
  опции профиля:
сообщение 26.10.2009, 11:39
Сообщение #3


Участник
**

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

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




Репутация:   0  


Где-то в блогах Qt, или еще где-то, не помню, писалось про тормозливость QDir.entryList(const QStringList & nameFilters). Насколько я понял(прочтя ту статью), что если нужна интенсивная работа с этим методом, то лучше написать свой метот, используя API системы. Позже, тоже не помню где, вычитал, что исправили этот недочет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 26.10.2009, 12:36
Сообщение #4


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Попробуй версию 4.6, там должны быть улучшения по этому поводу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 26.10.2009, 14:13
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 26.10.2009, 11:06) *
Цитата(maric2000 @ 26.10.2009, 14:00) *
многократно в цикле вызывать QDir.entryList(const QStringList & nameFilters) с разными масками файлов.
Я бы взял все файлы (без фильтра), а потом этот список бы фильтровал.

Я бы тоже так делал.
maric2000
entryList медленная, а ты ее еще и в цыкле вызываешь и она стает мегамедленной :)
делай так:
вызываешь QDir.entryList() без фильтров 1 раз, получаешь все файлы в QFileInfoList, а потом в цикле по QFileInfoList проверяешь подходит ли он к твоему фильтру(isFile, isHidden), если да то увеличиваешь счетчик
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 26.10.2009, 17:44
Сообщение #6


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

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




Репутация:   3  


Тогда не entryList, а entryInfoList.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maric2000
  опции профиля:
сообщение 27.10.2009, 9:35
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 26.10.2009
Пользователь №: 1179

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




Репутация:   0  


Спасибо всем! Реализовал оба варианта: и через API функции, и через заранее созданный список. Оба работают приемлемо быстро. Скачал Qt4.6 Beta1, установлю, попробую, отпишусь, исправили ли.

Программу интересуют файлы в директории следующего формата: "??????.??";
Исходный вариант ф-ии:
int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
    int retVal = 0;
    QStringList list(mask);
    QStringList listFiles = dir.entryList(list,QDir::Files);
    retVal = listFiles.count();
    return retVal;
}


вариант с API:
int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
    int retVal = 0;
    #ifdef Q_WS_WIN
    QString dirName = directory.absolutePath()+"/"+mask;
    WIN32_FIND_DATAA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;
    char DirSpec[MAX_PATH]; // directory specification
    qstrcpy(DirSpec,dirName.toLatin1().constData());
    hFind = ::FindFirstFileA(&DirSpec[0], &FindFileData);
    if (hFind != INVALID_HANDLE_VALUE)
    do
    {
      retVal++;
    } while (::FindNextFileA(hFind, &FindFileData) != 0);
    ::FindClose(hFind);
    #else
      << как в предыдущей ф-ии
    #endif
    return retVal;
}


Вариант с заранее созданным списком:

В конструкторе класса или в ф-ии update:
QStringList mask("??????.??");
m_fileList = dir.entryList(mask,QDir::Files);


int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
    int retVal = 0;
    bool ok;
    int cnt = m_fileList.count();
    for (int i=0; i<cnt; i++)
    {
      ok = true;
      for (int j=0; j<9; j++)
      {
        if ( (mask[j]=='?') || (mask[j]=='.') ) continue;
        if ( mask[j] != m_fileList[i][j]) {ok = false; break;}
      }
      if (ok) retVal++;
    }
    return retVal;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 6.6.2020, 23:49