![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
burakov |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Вот код
а вот код класса, который сканирует каталог рекурсивно я воспользовался помощью ginnie
P.S. Я попробовал сделать ДЕСТРОЙ на дескриптор в своем классе (который сканирует каталог НЕ рекурсивно) - и это СРАБОТАЛО. Т.е. многопоточность мне вообщем не нужна. но вот на классе ginnie (с которым я до конца так и не сумел разобраться) ДЕСТРОЙ не работает. вот пример моего НЕ рекурсивного класса,
Спасибо |
||||||
|
|||||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov, замените DESTROY на что-нибудь такое
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov,
так задавайте вопросы, где и что не понятно! Будем разбираться! Добавлено через 4 минуты и 24 секунды P.S. По проблеме с кнопкой могу предложить в функцию button_2_work() добавить warn и по логу посмотреть, в какой момент после нажатия кнопки оно отработает. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
Уважаемый ginnie, кнопка отрабатывает сразу. Проблема там в другом.
Просто массив $self после
еще содержит директории. И код продолжает возвращять имена файлов из них. И остановка происходит после отработки всех уже открытых директорий Поэтому я предложил burakov, в Destroy просто очистить массив $self и все. после этого кнопка отрабатывает сразу ![]() Это сообщение отредактировал(а) shamber - 4.9.2008, 14:32 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
shamber, спасибо за пояснения! Ваш вариант деструктора, несомненно, более правильный.
С идеологической точки зрения вызывать деструктор вручную не совсем грамотный подход, лучше остановить цикл. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
полностью с вами согласен ![]() Добавлено @ 11:50 burakov, как вариант, то о чем,как мне кажется, говорил ginnie.
Это сообщение отредактировал(а) shamber - 4.9.2008, 14:33 |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
или более компактный вариант процедуры
Это сообщение отредактировал(а) shamber - 4.9.2008, 14:39 |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
Ну как всегда спасибо за ответы... про связь undef-DESTROY это вы вовремя мне рассказали... ![]() вопросик по этому поводу: если объект сделать = undef, то выполнится DESTROY который записан в классе? или же какой нибудь автоматический перловый DESTROY (например если в классе нет sub DESTROY ![]() и еще вопросик по поводу класса DirScanRecurce, все еще пытаюсь в нем разобраться...
вообщем хороше бы код всего класса прокомментировать да и все тут ![]() Спасибо. |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, немного поясню по вызову DESTROY:
пусть в переменной $DirScanRecurce ссылка на объект класса DirScanRecurce. Если это единственная ссылка на этот объект, то при выполнении
ссылка удаляется и запускается процедура сбора мусора, в рамках которой вызывается метод DESTROY объекта, если он есть. Поэтому, можно считать процедуру сбора мусора автоматическим DESTROY, но он не заменяется методом класса, а дополняется. Если ссылок на объект больше одной, то undef одной из них не приведет к запуску сборщика мусора для объекта. По поводу return читаем perldoc -f return: "Если аргумент не задан, возвращается пустой список в списочном контексте, undef в скалярном контексте и ничего не возвращается в пустом (void) контексте."
говорит, что надо завершить цикл с меткой DH (т.е. выйти из него). После этой строчки следующей выполняется
Это сообщение отредактировал(а) ginnie - 5.9.2008, 11:54 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
спасибо за ответы с кодом $DirScanRecurce более менее разобрался. вот на его основе написал такой же, только он отдает не только файлы, но и каталоги, т.е. получается полное дерево. Удобно если допустим убирать-устанавливать атрибуты у файлов-каталогов. есть только один вопрос. вот кстати код
в моем варианте $workdir, который подставляется в sub new не попадает в print "$line\n"; понятно, что достать этот $workdir нетрудно, поскольку он известный (я же знаю, чего подставляю), но все таки возможно следующее ?: чтобы сканировало рекурсивно, в new подставлялся $workdir, а первым my $line = $test -> get_line() получался бы наш главный (родительский) $workdir, который мы подставляем в new? |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov,
если я скажу "нет", Вы поверите? ![]() комментируем строку
в конструкторе в get_line() дописываем:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |