Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149

Как приостановить выполнение рекурсии с файлами?

09.09.2016, 14:20. Показов 1003. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в такой ситуации...

Кликните здесь для просмотра всего текста
Visual Basic
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
Dim fso As New FileSystemObject, fldr As Folder, fil As File
Dim isFile As Long
 
Function GetFiles(a$, Optional r As Boolean = False) As Boolean
   
   Set MyFolder = fso.GetFolder(a$)
   Set SubF = MyFolder.SubFolders
   
   If Not r Then
      For Each fil In MyFolder.Files
         isFile = isFile + 1
      Next
   End If
   
   For Each fldr In MyFolder.SubFolders
      For Each fil In fldr.Files
         isFile = isFile + 1
      Next
      If fldr.SubFolders.Count > 0 Then Call GetFiles(fldr.Path, True)
   Next
   
End Function
 
Private Sub Form_Load()
   Call GetFiles("D:\!")
   MsgBox isFile
   Unload Me
End Sub


...сделать паузу во время подсчёта количества файлов? Вместо подсчёта может быть другое действие, например открыть, Append и закрыть. Если на форме будет кнопка "Пауза", как осуществить её при такой рекурсии, если в папке 1000 файлов и в глубину идёт папок 5, в каждом из которых тоже по 1000 файлов.

У меня есть идея, но она громоздка.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2016, 14:20
Ответы с готовыми решениями:

Как приостановить выполнение программы?
у меня в программе подключены модули graphabc и events. в общем программа продолжает выполняться не смотря ни на что, даже не смотря на...

Как приостановить выполнение макроса?
Как приостановить выполнение макроса до тех пор пока не нажмётся крестик (т.е. закрытие программы) другого приложения открывающегося из...

Как приостановить выполнение функции?
Как приостановить выполнение функции, а затем продолжить ее выполнение?

5
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
09.09.2016, 14:27
CharlyChaplin
Мне кажется что рекурсию "на паузу" нельзя поставить.
Досрочный выход если только...?
Может я и ошибаюсь...
0
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149
09.09.2016, 14:39  [ТС]
Моя идея заключается в том, чтобы не ставить на паузу, а создать видимость паузы путём выхода из функции с рекурсией. Но перед самым выходом вызывать процедуру, куда будут передаваться необходимые переменные, которые были в рекурсии. Например, в данном случае полный путь к текущему файлу.
1. Нажали паузу. Зафиксировали это глобальной переменной.
2. В рекурсии перед Exit Function вызвали Call SaveParam(fil.Path, Status as Boolean), где Status это либо запомнить параметры, либо выдать те, которые были присвоены.
3. При отжатии Паузы опять вызывается GetFiles. Но теперь необходимо будет опять рекурсировать папки, пока не встретиться нужный fil.Path и продолжить работу.

Но этот вариант не подойдёт, т.к. если файлов с папками очень много, то придётся всё перебирать заново, пока не встретим нужный нам fil.Path
Поэтому это громоздко и долго.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
09.09.2016, 15:04
CharlyChaplin
Вы верно мыслите. Из рекурсивной функции действительно
можно вызвать другую функцию по условию. Условием может
быть глобальная переменная равная некоторому числу. Число
задается кнопкой "пауза". Тогда вам не надо передавать
никаких параметров. Ведь функция вернется назад к тем
самым значениям с которых она ушла. В общем есть смысл
это попробовать...
0
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149
09.09.2016, 15:13  [ТС]
В Win10 реализована функция паузы при копировании и т.п. с файлами. Но ведь можно и обойтись простым

Visual Basic
1
Do: Loop Until Anything = MakeExit
Но он грузит процессор. Поэтому проблема. Google тоже не смог найти ничего.
Быть может Microsoft в Win10 использует какой-нибудь Halt, когда не выполняется ничего... "Вешает" процессор, пока никаких действий не выполняется...

Добавлено через 2 минуты
Цитата Сообщение от echs Посмотреть сообщение
CharlyChaplin
Вы верно мыслите. Из рекурсивной функции действительно
можно вызвать другую функцию по условию. Условием может
быть глобальная переменная равная некоторому числу. Число
задается кнопкой "пауза". Тогда вам не надо передавать
никаких параметров. Ведь функция вернется назад к тем
самым значениям с которых она ушла. В общем есть смысл
это попробовать...
Попробую что-нибудь сделать.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.09.2016, 14:51
Интересная задача.

Ну, у меня тут две идеи:

1) вынести код перечисления файлов в отдельный поток. В основную программу передавать результаты через IPC, SendMessage и т.п.
При необходимости в паузе - замораживать поток.

2) Сохранять имена обработанных файлов в словарь. Паузой завершать рекурсию и затем повторять перечисление полностью заново с проверкой из словаря. Это если основное время тратится на обработку, а не перечисление файлов.
А если доступны повышенные привилегии, то перечислять файлы на томах NTFS можно так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2016, 14:51
Помогаю со студенческими работами здесь

как приостановить выполнение процедуры
Доброго всем времени суток Из Excel создаю, печатаю и закрываю документ Word без сохранения Sub Create_ACT() ... ... ...

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

Как приостановить выполнение приложения?
Как при определенных условиях приостановить выполнение приложения? protected void onCreate(Bundle savedInstanceState) { ...

Как приостановить выполнение программы (пауза)?
Как сделать паузу((программно) для рассмотрения изображённой фигуры?

Как приостановить выполнение php до получения данных из js
В общем нужно получить значение от пользователя из js, а затем отправить его в php, но пока php не получил значение он должен ждать. ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru