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

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

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

есть рекурсивная функция поиска файлов, как остановить поиск?

(задача - мягко остановить поток, без terminate)

Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFind( const QString &pathr, QStringList filters )
{
QString path;
if(pathr.isEmpty()) path = QDir::currentPath();
     else path = pathr;
QDir dir(path);
if(!dir.exists())
{
return QStringList();
}
 
QStringList listFiles = QStringList();
 
 
foreach (QString file, dir.entryList(filters))
{
listFiles << QFileInfo(dir, file).absoluteFilePath();
 
}
 
m_countFiles+= dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot).count();
 
foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{
listFiles << getListFilesFind(path + QDir::separator() + subDir, filters);
m_currentNumberFile ++;
emit progress(m_currentNumberFile *100 / m_countFiles);
}
 
 
return listFiles;
}
 
void CFileFindThread::run()
{
 
m_FilesList = getListFilesFind(m_Path,m_FilterNames);
 
 
}
« Последнее редактирование: Март 15, 2012, 01:52 от daimon » Записан
Bepec
Гость
« Ответ #1 : Март 13, 2012, 06:59 »

Внутрь каждого foreach втулить условие на флаг и прерывание цикла.

Написать слот, который меняет значение флага.

Вызвать в нужный момент слот, который поменяет значение флага, который прервёт циклы, которые завершившись пройдут дальше по run и далее поток выполнив run завершится 200% мягко и корректно.
Записан
daimon
Гость
« Ответ #2 : Март 13, 2012, 13:37 »

Внутрь каждого foreach втулить условие на флаг и прерывание цикла.

Написать слот, который меняет значение флага.

Вызвать в нужный момент слот, который поменяет значение флага, который прервёт циклы, которые завершившись пройдут дальше по run и далее поток выполнив run завершится 200% мягко и корректно.

оно то так, но тут может быть маленькая задержка в выходе из рекурсии - пока рекурсия заново свернётся, пройдёт время, например, если папок больше 100000 будет просматривать
Записан
daimon
Гость
« Ответ #3 : Март 13, 2012, 13:40 »

Цитировать
Внутрь каждого foreach втулить условие на флаг и прерывание цикла.

думаю лучше прерывать работу функции по return QStringList(), но так потеряю список уже найденных файлов
Записан
Bepec
Гость
« Ответ #4 : Март 13, 2012, 13:43 »

Цитировать
Внутрь каждого foreach втулить условие на флаг и прерывание цикла.
[/color]

Непонятно?

В любом случае будет задержка, заключающаяся в том, чтобы поток успел дойти до мест остановок (условий). Задержка будет незначительной, если правильно расставить условия.

Мгновенно можно завершить поток - terminate/exit.


update:
прерывай цикл, потом хоть на голове плясать можно Подмигивающий включая и ретурн QStringList.
Записан
V1KT0P
Гость
« Ответ #5 : Март 13, 2012, 13:44 »

Внутрь каждого foreach втулить условие на флаг и прерывание цикла.

Написать слот, который меняет значение флага.

Вызвать в нужный момент слот, который поменяет значение флага, который прервёт циклы, которые завершившись пройдут дальше по run и далее поток выполнив run завершится 200% мягко и корректно.
Интересно а если вместо прерывания циклов кинуть эксепшн и вверху его ловить это будет быстрее? Просто интересно какие будут плюсы и минусы =).
Записан
mutineer
Гость
« Ответ #6 : Март 13, 2012, 13:45 »

Мгновенно можно завершить поток - terminate/exit.

exit() мгновенно не завершит - управление должно дойти до ивент-лупа
Записан
mutineer
Гость
« Ответ #7 : Март 13, 2012, 13:46 »

Интересно а если вместо прерывания циклов кинуть эксепшн и вверху его ловить это будет быстрее? Просто интересно какие будут плюсы и минусы =).

terminate будет быстрее - эксепш не особо быстрая штука
Записан
daimon
Гость
« Ответ #8 : Март 13, 2012, 13:50 »

Внутрь каждого foreach втулить условие на флаг и прерывание цикла.

Написать слот, который меняет значение флага.

Вызвать в нужный момент слот, который поменяет значение флага, который прервёт циклы, которые завершившись пройдут дальше по run и далее поток выполнив run завершится 200% мягко и корректно.
Интересно а если вместо прерывания циклов кинуть эксепшн и вверху его ловить это будет быстрее? Просто интересно какие будут плюсы и минусы =).
выглядело красиво бы, но всё равно задержка при свёртывании рекурсии
Записан
V1KT0P
Гость
« Ответ #9 : Март 13, 2012, 13:55 »

выглядело красиво бы, но всё равно задержка при свёртывании рекурсии
А может еще проще вообще избавиться от рекурсии? Взять список в котором будут параметры и в цикле выполнять эти параметры пока не закончатся. И в итоге вместо рекурсии просто будешь в список добавлять параметры.
Записан
Bepec
Гость
« Ответ #10 : Март 13, 2012, 14:07 »

Ещё красивее было бы привести архитектуру в порядок Улыбающийся

Или как вариант - дать пользователю возможность дальше работать, не выключая поток Веселый
Записан
daimon
Гость
« Ответ #11 : Март 13, 2012, 14:09 »

выглядело красиво бы, но всё равно задержка при свёртывании рекурсии
А может еще проще вообще избавиться от рекурсии? Взять список в котором будут параметры и в цикле выполнять эти параметры пока не закончатся. И в итоге вместо рекурсии просто будешь в список добавлять параметры.

подробнее пожалуйста..
Записан
daimon
Гость
« Ответ #12 : Март 13, 2012, 14:17 »

Ещё красивее было бы привести архитектуру в порядок Улыбающийся

Или как вариант - дать пользователю возможность дальше работать, не выключая поток Веселый

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

Сообщений: 11445


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

Не вижу откуда возьмется "задержка свертывания рекурсии" если в каждый цикл просто вставить
Код
C++ (Qt)
if (m_StopFlag) return listFiles;
 
Скорее всего пауза вызвана чем-то другим (напр очередь забита сигналами прогресса).  

И еще не понял
Код
C++ (Qt)
QStringList listFiles = QStringList();   // какой в этом скрытый смысл ?
QStringList listFiles;   // почему не так?
 
Записан
daimon
Гость
« Ответ #14 : Март 13, 2012, 14:27 »

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

что лучше:

1. создать поток один раз и просто чередовать функции start, terminate (своя функция, меняет флаг для останова рекурсии)
     плюс - один раз выделил память и работать с одним потоком,
     минус - если поток не используется, висит в памяти, только одна ветка поиска файлов
2. создавать каждый раз извне (где он используется) и после отработки рекурсии делать deleteLater() и также в terminate (моя функция)  вызывать удаление потока deleteLater(),
    плюс - в памяти не висит просто так, можно запустить независимые ветки поиска файлов,
    минус - время на выделение памяти при создании ветки
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


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