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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
#1

Пауза FindFirstFile - C++

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

Хочется выслушать совет бывадых программеров - как сделать паузу или остановку рекурсивной процедуры, основанной на FindFirstFile и FindNextFile, по нажатию кнопки в форме Visual c++?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 21:50     Пауза FindFirstFile
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 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
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 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
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 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++
Здравствуйте, дорогие форумчане! Я только начал знакомиться с c++ и возникает много мелких вопросов. Они несложные, но выводят меня из...

Пауза в инжекнутой dll, не вещающая родительский процесс - C++
Сразу прошу прощения за дебильный заголовок, и саму постановку вопроса. Долго не спал. Как приостановить выполнение кода только в...

Ожидание нажатия кнопки или пауза в выполнении цикла - C++
Есть цикл, внутри него несколько кейсов. Необходимо каким-то образом реализовать "поэтапное" прохождение case-ов внутри цикла. Ф-ия...

FindFirstFile&&FindNextFile - C++
Работаю в Visual Studio 2010. Есть такой код: void print_diffs() { WIN32_FIND_DATA fd; HANDLE Handle; ...


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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru