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

Пауза FindFirstFile

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

Author24 — интернет-сервис помощи студентам
Хочется выслушать совет бывадых программеров - как сделать паузу или остановку рекурсивной процедуры, основанной на FindFirstFile и FindNextFile, по нажатию кнопки в форме Visual c++?!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2012, 21:50
Ответы с готовыми решениями:

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

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

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

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

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

Конкретно в твоём случае длительное действие представляет собой обращение к операционной системе. Это действие твоя программа не может контролировать никак. Если в каталоге очень много файлов или каталог находится на сетевом диске или ещё по каким-то причинам сие действие может выполняться долго, а потому программа в этом месте будет висеть. Значит, первый пункт не поможет, а поможет пункт второй. В своей программе я именно так и делал. Процесс скачивания файла из инета выделен в поток, а всё остальное (фактически отрисовка gui) - в главном процессе
1
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.06.2012, 22:38
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2012, 00:51
-=ЮрА=-, твоя схема будет не будет адэкватно работать, если внутри FindFiles будут тормоза. Твой поток будет ровно так же висеть в ожидании завершения тормозов, как висит и основной процесс у ТС'а (в противном случае он навряд ли бы задал этот вопрос)
0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 07:29
Evg, я понял о чем ты от замораживания программы спасаюсь с помощью PumpMessages.Один из моих диспетчеров уже позволчет производить навигацию в то время как несколько thread-нитей(по числу логических томов) ищут файлы.Единственным отдичием этого диспетчера является то что в памяти держу не WIN32_FIND_DATA а массив LPCITEMLIST как менее тяжеловесный при хранении
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2012, 09:39
В данном случае я не совсем про замораживание. В твоём подходе программа замораживаться не будет, т.к. поиск идёт в потоке. Но у неё будет заторможенная реакция на действие пользователя "отменить построение списка файлов"
0
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153
13.06.2012, 12:17  [ТС]
в антивирусах по-моему именно такая система заложена - при проверки файлов, при нажатии на кнопку в приложении "стоп" они не сразу останавливаются
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2012, 15:41
Цитата Сообщение от Mustang92 Посмотреть сообщение
в антивирусах по-моему именно такая система заложена
Антивирус - это НЕ просто приложение пользовательского уровня. Это софтина, которая ковыряется в системных файлах, а потому если операцию прервать посередине, то можно поломать операционку. Так что в антивирусах такое поведение имеет совсем другие причины.

Чтение списка файлов или скачивание данных из инета - безопасная операция, а потому её можно прерывать в любой момент
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2012, 15:41
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Kubernetes с Apache Flink для обработки данных в реальном времени
Mr. Docker 17.05.2025
Kubernetes — это целая философия управления распределёнными приложениями. В отличие от "примитивных" решений вроде Docker Swarm, K8s (как его ласково называют в тусовке DevOps-инженеров) предлагает. . .
Использование декораторов в Python
py-thonny 17.05.2025
Если вы когда-нибудь задумывались о том, как красиво расширить функциональность кода без лишней возни и дублирования, декораторы в Python — та самая волшебная палочка, которую вы искали. По сути, это. . .
Как некоторые отстают в навыках поиска информации в сети. Дублирование страницы открытого адреса в сети.
Hrethgir 17.05.2025
. . . берём бразуер, для многих он является инструментом поиска информации в сети. Понятное дело, что чтобы переходить по сслыкам есть такая фишка - "открыть в новой вкладке", но, представим себе что вы. . .
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
Использование вебсокетов в приложениях Java с Netty
Javaican 16.05.2025
HTTP, краеугольный камень интернета, изначально был спроектирован для передачи гипертекста с минимальной интерактивностью. Его главный недостаток в контексте современных приложений — это. . .
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
Настройка гиперпараметров с помощью Grid Search и Random Search в Python
AI_Generated 15.05.2025
В машинном обучении существует фундаментальное разделение между параметрами и гиперпараметрами моделей. Если параметры – это те величины, которые алгоритм "изучает" непосредственно из данных (веса. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru