5 / 5 / 1
Регистрация: 24.04.2011
Сообщений: 153
1

Пауза FindFirstFile

12.06.2012, 21:50. Показов 1307. Ответов 7
Метки нет (Все метки)

Хочется выслушать совет бывадых программеров - как сделать паузу или остановку рекурсивной процедуры, основанной на FindFirstFile и FindNextFile, по нажатию кнопки в форме Visual c++?!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2012, 21:50
Ответы с готовыми решениями:

работа с функцией FindFirstFile (API)
Здравствуйте уважаемые. У меня такая проблема - есть буфер (тип char) в нем хранятся пути к файлам,...

Windows.h добавлен FindFirstFile не найден
Здравствуйте. С таким кодом: #include "stdafx.h" #include <string> #include <fstream>...

Как запустить пример для FindFirstFile
Хочу запустить пример из MSDN для FindFirstFile. В Visual Studio 2015 создаю проект - консольное...

FindFirstFile -получение корректного имени файла
Всем доброго времени суток.Возникает ошибка при поиске файлов FindFirstFile.Нужно добавить все...

7
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
12.06.2012, 22:11 2
Грубо говоря, у тебя есть некое длительное действие программы и хочется, чтобы пользователь мог прервать это действие. Здесь есть два способа.

1. В процессе длительного действия периодически опрашивать "а не нажал ли пользователь на кнопку"
2. Длительное действие запускать в отдельном потоке, а по нажатию на кнопку поток прибить.

Конкретно в твоём случае длительное действие представляет собой обращение к операционной системе. Это действие твоя программа не может контролировать никак. Если в каталоге очень много файлов или каталог находится на сетевом диске или ещё по каким-то причинам сие действие может выполняться долго, а потому программа в этом месте будет висеть. Значит, первый пункт не поможет, а поможет пункт второй. В своей программе я именно так и делал. Процесс скачивания файла из инета выделен в поток, а всё остальное (фактически отрисовка gui) - в главном процессе
1
Заблокирован
Автор FAQ
12.06.2012, 22:38 3
Mustang92, собственно писал срузу здесь в редакторе, но в целом логика и вызовы верны. Вот некая абстрагированая реализация организации нити поиска и проверки нажатия нужного ключа в основном потоке для NT-платформы. Распараллеливание, как видишь, реализовал через Критическую секцию. Для её поддержки проект должен содержать process.h а также в опциях линковщика выставить поддержку run-time library Multythreaded
Собственно код ниже
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CRITICAL_SECTION cs;//Должна быть объявлена как глобальный параметр
WIN32_FIND_DATA * FindFiles(WIN32_FIND_DATA * pDATA, long *nFiles,BOOL bSTOP)
{
    //начинку мы пишем свою важны лишь флаг
}
 
typedef 
{
     WIN32_FIND_DATA * pDATA;
     char * szDIR;
     long    nFiles;
     BOOL bSTOP;
}THREAD_PARAM;
 
void ThreadSearch(PVOID pParam)
{
     THREAD_PARAM pPARAM = (THREAD_PARAM *)pParam;
     while(!pPARAM.bSTOP)
     {
           EnterCriticalSection(&cs);//Входим в критическую секцию
          //Вызов нашей ркурсивной функции поиска
           pPARAM.pDATA = FindFiles(pPARAM.pDATA, &pPARAM.nFiles,pPARAM.bSTOP);
           LeaveCriticalSection(&cs);//покидаем критическую секцию
     }
     _endthread();
}
     
int main()
{
     char szSTARTPATH[MAX_PATH] = {0};
     
     InitializeCriticalSection(&cs);
     THREAD_PARAM pPARAM = {0};
     //вводим pPARAM.szDIR
     _beginthread(ThreadSearch,0,&pPARAM);//Создали нить для поиска
     BOOL bSTOP = FALSE;
     while(!bSTOP)
     {
           EnterCriticalSection(&cs);//Входим в критическую секцию
           //Каки либо образом проверяем состояния ключа для останова (паузы)
           //Состояние данного ключа должно влиять на флаг bSTOP
           pPARAM.bSTOP = bSTOP;
           LeaveCriticalSection(&cs);//покидаем критическую секцию
     }
     //Дальнейшая обработка структуры pPARAM
     //(она будет содержать список найденный структур WIN32_FIND_DATA)
     DeleteCriticalSection(&cs);//Удаляем критическую секцию
     return 0;
}
Проверка ключей может выполнена не чере getch как это мы часто делаем а через GetAsyncKeyState, за справкой ходи сюда МойБлог : Стрелки в консоли
1
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
13.06.2012, 00:51 4
-=ЮрА=-, твоя схема будет не будет адэкватно работать, если внутри FindFiles будут тормоза. Твой поток будет ровно так же висеть в ожидании завершения тормозов, как висит и основной процесс у ТС'а (в противном случае он навряд ли бы задал этот вопрос)
0
Заблокирован
Автор FAQ
13.06.2012, 07:29 5
Evg, я понял о чем ты от замораживания программы спасаюсь с помощью PumpMessages.Один из моих диспетчеров уже позволчет производить навигацию в то время как несколько thread-нитей(по числу логических томов) ищут файлы.Единственным отдичием этого диспетчера является то что в памяти держу не WIN32_FIND_DATA а массив LPCITEMLIST как менее тяжеловесный при хранении
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
13.06.2012, 09:39 6
В данном случае я не совсем про замораживание. В твоём подходе программа замораживаться не будет, т.к. поиск идёт в потоке. Но у неё будет заторможенная реакция на действие пользователя "отменить построение списка файлов"
0
5 / 5 / 1
Регистрация: 24.04.2011
Сообщений: 153
13.06.2012, 12:17  [ТС] 7
в антивирусах по-моему именно такая система заложена - при проверки файлов, при нажатии на кнопку в приложении "стоп" они не сразу останавливаются
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
13.06.2012, 15:41 8
Цитата Сообщение от Mustang92 Посмотреть сообщение
в антивирусах по-моему именно такая система заложена
Антивирус - это НЕ просто приложение пользовательского уровня. Это софтина, которая ковыряется в системных файлах, а потому если операцию прервать посередине, то можно поломать операционку. Так что в антивирусах такое поведение имеет совсем другие причины.

Чтение списка файлов или скачивание данных из инета - безопасная операция, а потому её можно прерывать в любой момент
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2012, 15:41
Помогаю со студенческими работами здесь

Как правильно передать в FindFirstFile путь к директории?
хочу сделать так, чтобы можно было путь прописывать не прямо в функцию FindFirstFile, а через...

Функция поиска файлов, и вывод списка найденных (использую FindFirstFile, FindNextFile)
Друзья, возникла следующая сложность, написал функцию для поиска файлов(.txt) в текущей директории,...

пауза консольного приложения
что не так с кодом? он дает записывать в файл но при первой строчке он просто выдает "?" без кд и в...

Пауза при работе программы.
Кроме system("pause") есть еще команды, которыми можна приостановить работу программы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru