Добрый день.
Делаю окно поиска файлов, разбил программу на два класса.
1) GUI окно с потоком
2) класс в котором происходит поиск файлов, в этом классе происходит генерация сигнала найденного файла типа QString и потом уже в класс GUI под средством слота передаю эту строку QListWidget.
Когда конкретные файлы то всё работает отлично, но когда я начинаю например поиск всех файлов в диске D: (много файлов), то окно подвисает, в конечном результате оно нормально всё потом отображает, все файлы с диска D:
Вопрос: как добиться чтобы в QListWidget добавлялись файлы при поиске так же плавно как и в TotalCommander, когда в нём ищешь то там файлы нормально без подвисаний добавляются.
Ниже участки кода:
1) блок вычисления
void filesSearchEngine::process()
{
QStringList nameFilter;
int starCnt = 0;
if (m_strFileNames.contains("*")) {
//если есть звёзды то считаем их
for (int i = 0; i < m_strFileNames.size(); ++i)
if (m_strFileNames.at(i) == '*')
++starCnt;
//если количество звёзд равно 1 то создаём фильтр
if (starCnt == 1 && m_strFileNames.at(0) == '*') {
nameFilter.append(m_strFileNames);
m_strFileNames.clear();
}
//если количество звёзд > 1;
else if (starCnt == 2 && m_strFileNames == "*.*") {
m_strFileNames.clear();
}
}
QDirIterator it(m_dirPath, nameFilter, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
//break thread
if (thread_Break)
break;
sync.lock();
if (thread_Pause)
pauseCond.wait(&sync);
sync.unlock();
emit currentSearchPatch(it.filePath());
if (it.fileName().contains(m_strFileNames)) {
emit foundFilePatch(it.filePath());
}
else if (m_strFileNames.isEmpty()) {
emit foundFilePatch(it.filePath());
}
}
emit currentSearchPatch(":");
emit finished();
}
2) блок в GUI, слот добавления элементов в QListWidget
void wgtFilesSearch::addItemToFileList(QString data)
{
m_foundFileList->addItem(data);
}
добавление в поток
//thread
m_fileSearchThread = new QThread();
m_searchEngine = new filesSearchEngine(); //<<search class
m_searchEngine->moveToThread(m_fileSearchThread);
ниже стандартные коннекты