Форум программистов, компьютерный форум CyberForum.ru

Пауза FindFirstFile - C++

Восстановить пароль Регистрация
 
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
12.06.2012, 21:50     Пауза FindFirstFile #1
Хочется выслушать совет бывадых программеров - как сделать паузу или остановку рекурсивной процедуры, основанной на FindFirstFile и FindNextFile, по нажатию кнопки в форме Visual c++?!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
12.06.2012, 22:11     Пауза FindFirstFile #2
Грубо говоря, у тебя есть некое длительное действие программы и хочется, чтобы пользователь мог прервать это действие. Здесь есть два способа.

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

Конкретно в твоём случае длительное действие представляет собой обращение к операционной системе. Это действие твоя программа не может контролировать никак. Если в каталоге очень много файлов или каталог находится на сетевом диске или ещё по каким-то причинам сие действие может выполняться долго, а потому программа в этом месте будет висеть. Значит, первый пункт не поможет, а поможет пункт второй. В своей программе я именно так и делал. Процесс скачивания файла из инета выделен в поток, а всё остальное (фактически отрисовка gui) - в главном процессе
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2012, 22:38     Пауза FindFirstFile #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, за справкой ходи сюда МойБлог : Стрелки в консоли
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
13.06.2012, 00:51     Пауза FindFirstFile #4
-=ЮрА=-, твоя схема будет не будет адэкватно работать, если внутри FindFiles будут тормоза. Твой поток будет ровно так же висеть в ожидании завершения тормозов, как висит и основной процесс у ТС'а (в противном случае он навряд ли бы задал этот вопрос)
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 07:29     Пауза FindFirstFile #5
Evg, я понял о чем ты от замораживания программы спасаюсь с помощью PumpMessages.Один из моих диспетчеров уже позволчет производить навигацию в то время как несколько thread-нитей(по числу логических томов) ищут файлы.Единственным отдичием этого диспетчера является то что в памяти держу не WIN32_FIND_DATA а массив LPCITEMLIST как менее тяжеловесный при хранении
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
13.06.2012, 09:39     Пауза FindFirstFile #6
В данном случае я не совсем про замораживание. В твоём подходе программа замораживаться не будет, т.к. поиск идёт в потоке. Но у неё будет заторможенная реакция на действие пользователя "отменить построение списка файлов"
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
13.06.2012, 12:17  [ТС]     Пауза FindFirstFile #7
в антивирусах по-моему именно такая система заложена - при проверки файлов, при нажатии на кнопку в приложении "стоп" они не сразу останавливаются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 15:41     Пауза FindFirstFile
Еще ссылки по теме:

C++ Пауза в инжекнутой dll, не вещающая родительский процесс
C++ FindFirstFile
Windows.h добавлен FindFirstFile не найден C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
13.06.2012, 15:41     Пауза FindFirstFile #8
Цитата Сообщение от Mustang92 Посмотреть сообщение
в антивирусах по-моему именно такая система заложена
Антивирус - это НЕ просто приложение пользовательского уровня. Это софтина, которая ковыряется в системных файлах, а потому если операцию прервать посередине, то можно поломать операционку. Так что в антивирусах такое поведение имеет совсем другие причины.

Чтение списка файлов или скачивание данных из инета - безопасная операция, а потому её можно прерывать в любой момент
Yandex
Объявления
13.06.2012, 15:41     Пауза FindFirstFile
Ответ Создать тему
Опции темы

Текущее время: 17:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru