| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Виснет компьютер при обработке длинных списков

Виснет компьютер при обработке длинных списков

Ответ
Поиск в этой теме
Непрочитано 23.06.2006, 15:12 #1
Виснет компьютер при обработке длинных списков
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Зметил такое явление:
Если лиспом обрабатывать очень много примитивов, то все работает очень медленно или вовсе все виснет.
Вот создал программу обработки осевых линий –
выбираем линии, указываем расстояние на которое вырастет каждый конец этих линий.

Вот основная часть кода

Код:
[Выделить все]
(mapcar '(lambda (a b d) (vla-ScaleEntity a b d)) (список примитивов VLA) (список координат центров линий 3dpoint) ( список масштабов VariantVBDouble))
вот одно из возвращаемых значений в командную строку

Код:
[Выделить все]
Команда: osu

OSILINU = 1.0
Выберите объекты: Противоположный угол: найдено: 53168

Выберите объекты:

Отступ осевой линии <1.0> : 5

"Обработано 53168 линий"
53168 линий обрабатывались примерно 1,5минуты – очень долго

а вот

Код:
[Выделить все]
Команда:
OSU
OSILINU = 5.0
Выберите объекты: Противоположный угол: найдено: 72917

Выберите объекты:

Отступ осевой линии <5.0> : 100
; ошибка: Возникло исключение: 0xC0000005 (Нарушение доступа)
; предупреждение: раскрутка пропущена для исключение
; ошибка: Возникло исключение: 0xC0000005 (Нарушение доступа)

Команда:
С 70000 линий и вовсе не справилась.

Пробовал сделать так, чтобы списки с необходимыми параметрами создавались в виде безопасных массивов, результат есть – 150 000 линий обрабатываются
Примерно через 3 минуты выдается сообщение "Обработано 150000 линий" , но компьютер виснет и не выходит из ступора совсем.

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

Впринципе наврядли комунибудь понадобится увеличивать десятки тысяч линий, такие операции обычно применимы к осевым, если еще учесть то что есть программа рисования осевых которая за один прием сразу рисует и увеличивает линию. А если кому и приспичит, то это будет всего 10 – 20 линий за один прием.
Но всеравно хотелось бы добиться стабильности.
Вот здесь лежит проблемная программа
Проблемные функции (C:OSV) (C:OSU)
[ATTACH]1151061133.rar[/ATTACH]
Просмотров: 6381
 
Непрочитано 23.06.2006, 16:17 Re: Виснет компьютер при обработке длинных списков
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от mmax
Зметил такое явление:
Если лиспом обрабатывать очень много примитивов, то все работает очень медленно или вовсе все виснет.

..................................
Мне приходится постоянно обрабатывать большие списки...
Извини, сейчас мне не до твоей программы, но сходу посоветую!
Добавь в свою программу прогресс бар!
Постоянное обращение к нему - будет оживлять экран и уменьшать видимые тормоза акада.

Вообще советую обратить внимание на отлично зарекомендовавшие себя программы на ARX - написал Александр Ривилис!
http://www.maestrogroup.com.ua/support/ProgressBars.zip
Использую постоянно...
Кстати, там есть команды, размораживающие зависший интерфейс акада - т.е. во время выполнения лиспа можно добавить дополнительные команды, чтоб pan/zoom - работали без тормозов!
Елпанов Евгений вне форума  
 
Непрочитано 23.06.2006, 17:19
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Думаю, что можно попробовать отключить регенерацию (regenmode), попробовать выполнить, потом vla-regen для активного документа и в режиме, наверное, acallviewports. потом восстановить regenmode.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.06.2006, 17:37
#4
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Проблемной я ее назвал условно. Просто при обработке десятков и сотен тысяч линий, она кушает много ресурсов и виснет весь компьютер вместе с мышкой.
mmax вне форума  
 
Непрочитано 25.06.2006, 12:12
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Вопросы:
1) Версия AutoCAD? Наличие SP?
2) Версия Windows?
3) Параметры PC (в первую очередь величина RAM)?
Замечание:
Когда работает lisp-программа не использующая взаимодействие с пользователем (как в данном случае) AutoCAD не успевает обработать свою очередь сообщений и может подвиснуть. Совет Евгения в ряде случаев может помочь, правда за счет некоторой потери производительности.
Александр Ривилис вне форума  
 
Непрочитано 25.06.2006, 16:24
#6
C1


 
Регистрация: 13.06.2005
Сообщений: 314


А если вместо лиспа использовать VBA? Мне кажется он на порядок быстрее.
C1 вне форума  
 
Непрочитано 25.06.2006, 16:32
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от C1
А если вместо лиспа использовать VBA? Мне кажется он на порядок быстрее.
Во-первых, вопрос о замене lisp'а на VBA не стоял.
Во-вторых, по поводу что быстрее - вопрос далеко не однозначный.
В-третьих, если уж на что-то менять, то на ObjectARX.
Александр Ривилис вне форума  
 
Непрочитано 25.06.2006, 21:48
#8
C1


 
Регистрация: 13.06.2005
Сообщений: 314


Цитата:
Сообщение от Александр Ривилис
по поводу что быстрее - вопрос далеко не однозначный.
Да не всегда так уж на порядок быстрее. Но в каждом конкретном случае можно поставить эксперимент. Ключевой фрагмент кода на лиспе и на VBA (или в другом языке).
C1 вне форума  
 
Автор темы   Непрочитано 26.06.2006, 21:33
#9
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Компьютер у меня слабый
Селерон 2000Мгц
озу 256Мб
Windows XP SP1 Pro
Autocad 2006 SP1

И вот возникает вопрос по ProgressBars
Я не силен в программировании и мне не понятно когда и в каком месте программы нужно применять функции из данного пакета.

Подскажите пожалуйста на примере вот такой самой подходящей для данной темы функции

Код:
[Выделить все]
;получение списка последовательности чисел
;index1=Индекс первого числа
;index2=Индекс последнего числа
;start = первое число списка
;step = шаг

(defun num_lst_s_vla (index1 index2 start  step  / a b i n sf) 
(setq a  index1)
(setq b  index2)
(vl-load-com)
(setq sf (vlax-make-safearray vlax-vbdouble (cons a b)))
(setq i 0)
(setq n (- start step))
(repeat index2 (vlax-safearray-put-element sf (setq i (1+ i)) (setq n (+ step n))))
(vlax-safearray->list sf)
)
;пример (num_lst_s_vla 1 200 1 1)
;возвращает (1 2 3 4 5...........198 199 200)
Допустим на какомто шаге моей программы выполняется функция
(num_lst_s_vla 1 2000000 1 1)
Как ее оптимизировать с помощью ProgressBars?
Или где можно получить более подробную информацию?
mmax вне форума  
 
Непрочитано 27.06.2006, 02:35
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Компьютер действительно достаточно слабый. Особенно не хватает озу (для минимальной конфигурации нужно 512М).
Попробуй такой вариант (ProgressBars.arx должен быть в путях доступа AutoCAD):
Код:
[Выделить все]
(defun num_lst_s_vla (index1 index2 start  step  / a b i n sf) 
  (if (and (null ProgressBar) (= (arxload "ProgressBars.arx" "err") "err")) (progn
    (alert "Не найден ProgressBars.arx!")
    (exit)
  ))
  (setq a  index1) 
  (setq b  index2) 
  (vl-load-com) 
  (setq sf (vlax-make-safearray vlax-vbdouble (cons a b))) 
  (setq i 0) 
  (setq n (- start step)) 
  (ProgressBar "num_lst_s_vla" index2)
  (repeat index2 
    (vlax-safearray-put-element sf (setq i (1+ i)) (setq n (+ step n)))
    (ProgressBar t)
  ) 
  (ProgressBar)
  (vlax-safearray->list sf) 
)
P.S.: Только если ты для проверки запустишь эту функцию со значением всего лишь 200000, а не 2000000 как у тебя, то она будет печатать результирующий список в командной строке AutoCAD раз в 10 дольше, чем будет работать функция. Так что учти этот момент.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 29.06.2006, 03:37
#11
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Вот поколдовал я над ProgressBars и вроде бы понял как их использовать.

И вот еще хочу спросить совета по использованию в ситуации когда обрабатывается не один ряд списков а несколько рядов, как например в моей программе про осевые линии.
Там процесс идет таким образом – получаем один список, каким либо образом преобразуем этот список потом получившийся список еще раз преобразуем итд. Единственное условие которое там соблюдается – это количество элементов каждого списка одинаково.

И если на каждый шаг ставить отдельный прогресс то получится некрасиво.

Поэтому я наколдовал, покачто на примере (num_lst_s_vla), вот такое
Код:
[Выделить все]
(defun c:prgnst ()
  (PrgSet "Progress_num_lst_s_vla" 20000 )
   (mapcar
              '(lambda (a b c) (+ a b)(PrgProgress c))
	     (num_lst_s_vla 1 20000 2 1)
                     (num_lst_s_vla 1 20000 1 1) 
                     (num_lst_s_vla 1 20000 1 0.5))
   (mapcar 
             '(lambda (d e f ) (+ d e)(PrgProgress f))
	     (num_lst_s_vla 1 20000 8 1) 
                     (num_lst_s_vla 1 20000 10 1) 
                     (num_lst_s_vla 1 20000 10000 0.5))
  (PrgStop)
    )
И хочу спросить следующее:
Есть какиенибудь другие способы наложения прогресса на несколько рядов?
Если мой способ приемлем то:
Куда лучше вставить (OnIdleAcad [<TimeInt>]) и (mDelay <msecs>)?
У (PrgSet <Текст> <MaxValue> [<TimeInt>]) какое максимальное и минимальное значение [<TimeInt>]?

И еще вопрос о такой ситуации:
В программе укорачивания линий есть такой момент

Код:
[Выделить все]
(if
       (vl-member-if-not '(lambda (bad) (< (* osiu_s 2) bad)) dln_lin)
	  (progn (alert (strcat "Отступ превышает допустимое значение."
	                  "\nЗначение отступа не должно превышать"
			  "\nполовины длины одной или нескольких линий."
			  "\n\nЗадайте корректное значение!")) (exit))
	   (princ)
       )
Если я действительно укажу некорректное значение, то обработка списка оборвется не там где надо и выполнится (exit), как отреагирует система, чего ожидать?

Если во время работы прогресса нажать ESC то в командную строку выдается
Код:
[Выделить все]
Команда: prgnst
; вход в цикл останова с клавиатуры
и Автокад висит пока не закрыть Лисп-редактор.

И почемуто не видно индикатора в командной строке, в заголовке и диалоге все работает.


Всем огромное спасибо.

Отдельное спасибо Александру Ривилису.
mmax вне форума  
 
Непрочитано 27.10.2010, 11:04
#12
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


mmax, дружище, так тебе помог ProgressBar??
А то у меня похожая проблема, вот и думаю - стоит заморачиваться?
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 27.10.2010, 12:12
#13
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Я когда-то использовал, потом отказался.
От зависаний помогает тем, что пользователь наблюдает не зависший автокад а растущий прогрессбар.
Причины, почему отказался:
- для разных версий автокада разные arx-файлы прогрессбара, все их надо располагать вместе с программой, а мне лично нравится, когда вся программа только в одном лисп-файлике
- прогрессбар притормаживает работу программы
- в тех программах, где я его использовал, оказалось возможным пересмотреть алгоритм, чтобы не было многоминутных вычислений.
А "заморочится" стоит! Потому что, если без многоминутных вычислений не обойтись, то альтернативы практически нет.
Do$ вне форума  
 
Непрочитано 27.10.2010, 12:26
#14
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


>>Do$
Спасибо за подсказку.
Был бы очень благодарен, если бы ты заглянул сюда
http://forum.dwg.ru/showthread.php?p=645087&posted=1

На случай, если не заглянешь, спрошу здесь.
Благодаря чему ProgressBar решает сабжевую проблему? я попробовал (mdelay) - не помогло. Что в нем (в ProgressBar.arx) еще такое используется, не знаешь? (Автору ProgressBar'а Александру Ривилису я уже задал этот вопрос, жду ответа и от него)
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 27.10.2010, 12:38
#15
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Как я думаю, через определенное кол-во вычислений управление передается arx приложению, лисп-приложение приостанавливается, обновляется экран, изменяется положение прогрессбара и затем управление возвращается лисп-приложению.
Лучше автора никто не ответит, так что надо ждать
Do$ вне форума  
 
Непрочитано 27.10.2010, 14:32
#16
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Ага. Если это действительно так, то по сути это организация полноценных разрывов в выполнении лисп-программы. Спасибо. Жду подтверждения от автора :-)
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 27.10.2010, 15:42
1 | #17
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Ax3 Посмотреть сообщение
(Автору ProgressBar'а Александру Ривилису я уже задал этот вопрос, жду ответа и от него)
Вопроса не видел.

Цитата:
Сообщение от Do$ Посмотреть сообщение
Как я думаю, через определенное кол-во вычислений управление передается arx приложению, лисп-приложение приостанавливается, обновляется экран, изменяется положение прогрессбара и затем управление возвращается лисп-приложению.
Приблизительно так.
Александр Ривилис вне форума  
 
Непрочитано 28.10.2010, 12:17
#18
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Вопроса не видел.
http://forum.dwg.ru/showthread.php?p...d=1#post645324 пост #7
__________________
На LISPе можно мыслить!
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Виснет компьютер при обработке длинных списков

Размещение рекламы