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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как организовать событие "Закончилась минута"?

Как организовать событие "Закончилась минута"?

Ответ
Поиск в этой теме
Непрочитано 06.12.2004, 15:45 #1
Как организовать событие "Закончилась минута"?
kos
 
LISP-программист
 
Тутэйшы
Регистрация: 25.08.2003
Сообщений: 238

Есть такая необходимость: раз в минуту вылолнять определенную функцию (типа функции отклика). Очень похоже на обработку реактора. Однако AutoCAD не предоставляет события "Закончилась минута". Попытка организовать бесконечный цикл типа
Код:
с последующим анализом времени в принципе работает, но загружает процессор так, что другие процессы чахнут.
Есть ли решение этой проблемы (задача для AutoCAD'а необычная...)?
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
Просмотров: 8205
 
Непрочитано 06.12.2004, 16:02
#2
Геннадий aka PG

Машиностроение, Проектирование
 
Регистрация: 15.09.2003
Москва
Сообщений: 1,113
<phrase 1=


Вводится по-минутная оплата?
В эту минуту, полагаю, пользователь что-то делает (работает, чертит, смотрит)?
__________________
С уважением,
Геннадий aka PG
Геннадий aka PG вне форума  
 
Автор темы   Непрочитано 06.12.2004, 16:58
#3
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Геннадий aka PG
Вводится по-минутная оплата?
Да, что-то вроде этого...
Цитата:
Сообщение от Геннадий aka PG
В эту минуту, полагаю, пользователь что-то делает (работает, чертит, смотрит)?
Смотрит, только смотрит. Естественно, он может менять zoom, панорамировать, переходить по именованным видам, выводить на печать. Править - ни-ни!...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 06.12.2004, 17:38
#4
AY


 
Сообщений: n/a


Как вариант от зависания можно попробовать в цикл добовлять (command "DELAY" 5000), хотя едва ли это поможет. Я знаю что при програмировании Win приложений можно создавать таймер и по прошествии необходимого времени система сама шлет сообщение. Но как это сделать на лиспе?. Может из VBA имеется возможность?
 
 
Автор темы   Непрочитано 06.12.2004, 17:49
#5
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от AY
Как вариант от зависания можно попробовать в цикл добовлять (command "DELAY" 5000), хотя едва ли это поможет. Я знаю что при програмировании Win приложений можно создавать таймер и по прошествии необходимого времени система сама шлет сообщение. Но как это сделать на лиспе?. Может из VBA имеется возможность?
Delay точно не поможет.
И в DOSе прерывание по таймеру было доступно. Но не в AutoCAD...
VBA - увы - не знаю.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 06.12.2004, 18:00
#6
AY


 
Сообщений: n/a


А что если добавить лисп-функцию из ARX, а в ней получив из лиспа требуемый промежуток времени ожидать сообщения таймера, а потом возвращать значение в лисп? Интерестно будет ли такая конструкция подвешивать систему или вообще работать? В принципе, для знающего человека, такая функция раз плюнуть. Дело за малым: найти такого человека.
 
 
Непрочитано 07.12.2004, 09:30
#7
AY


 
Сообщений: n/a


Я тут вчера вечером попробовал то о чем говорил, кое-что поучается, могу выслать на пробу, толко не знаю куда.
 
 
Непрочитано 07.12.2004, 10:47
#8
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Цитата:
Есть такая необходимость: раз в минуту вылолнять определенную функцию (типа функции отклика).
Какую и для чего?
Эдуард вне форума  
 
Непрочитано 07.12.2004, 12:16
#9
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Почему-бы не привязать функцию отклика к реактору команд
С последующим отслеживанием переменной cdate?
Допустим так:
Код:
[Выделить все]
(defun rminutka	()
  (setq oldcd (fix (* (rem (getvar "cdate") 0.01) 10000)))
  (setq	svrm (vlr-command-reactor
	       nil
	       (list '(:VLR-commandwillstart . minutka))
	     ) ;_ end of vlr-command-reactor
  ) ;_ end of setq
) ;_ end of defun
(defun minutka (a b)
  (if

    (minusp
      (- oldcd
	 (setq newcd (fix (* (rem (getvar "cdate") 0.01) 10000)))

      ) ;_ end of -

    ) ;_ end of minusp
     (progn
       (alert "Минута уже прошла")
       (setq oldcd newcd)
     ) ;_ end of progn

  ) ;_ end of if
) ;_ end of defun
Эдуард вне форума  
 
Автор темы   Непрочитано 06.01.2005, 10:12
#10
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Подниму тему, ибо проблема хотя и потеряла свою срочность, но по-прежнему не решена.

Эдуард, Ваше предложение привязаться к реактору команд не подходит. Функция отклика должна периодически выполняться независимо от того, делает пользователь что-либо или просто тупо смотрит в монитор. А может он курить пошел? Или (учитывая новогоднюю специфику) уже под елкой лежит?
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 06.01.2005, 12:19
#11
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Задать автосохранение рисунка раз в минуту (переменная savetime).
Прицепить к рисунку реактор vlr-beginSave.

Если рисунок большой, то сохранение раз в минуту будет сильно напрягать пользователя.
Тогда создаем временный пустой рисунок temp.dwg и цепляем реактор на него.
А сами переключаемся в рабочий рисунок.
Вот только не проверял, будет ли такая схема работать.

Чтобы пользователь ручками не менял переменную, цепляем реактор vlr-sysVarWillChange. И при изменении переменной savetime меняем ее обратно.
Torino вне форума  
 
Автор темы   Непрочитано 06.01.2005, 12:37
#12
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Torino
Если рисунок большой, то сохранение раз в минуту будет сильно напрягать пользователя.
Тогда создаем временный пустой рисунок temp.dwg и цепляем реактор на него.
А сами переключаемся в рабочий рисунок.
Вот только не проверял, будет ли такая схема работать.
Увы, не будет. Ибо
Цитата:
Тип: целый
Запись в: реестр
(с) help к AutoCAD 2004.
Т.е. переменная устанавливается для ВСЕХ рисунков и автоматически сохраняться будут тоже ВСЕ и "если рисунок большой, то сохранение раз в минуту будет сильно напрягать пользователя".
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 06.01.2005, 14:00
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


На уровне идеи (возможно бредовой): внешний EXE-шник, добавленный в автозагрузку винды, ищет открытые сеансы АКАД, в них ищет чертежи с неким "контрольным" примитивом, модифицирует этот примитив... Ну а реактор, прицепленный к этому же примитиву, запускает какую надо функцию. Нет в чертеже "контрольки" - нет и запуска функции.
vk вне форума  
 
Непрочитано 06.01.2005, 21:05
#14
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>kos
Если Вас устраивал вариант (while T ...) за исключением "подвешивания", то я решительно не понимаю почему Вы отказываетесь рассматривать вариант с ARX. Я нашел Ваш адрес и вышлю все таки Вам вариант.
AY вне форума  
 
Автор темы   Непрочитано 10.01.2005, 09:29
#15
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от AY
>kos
...я решительно не понимаю почему Вы отказываетесь рассматривать вариант с ARX. Я нашел Ваш адрес и вышлю все таки Вам вариант.
Я не отказываюсь. Просто я весьма туманно знаю что такое ARX.
Если Вы будете так любезны и вышлете "вариант" - буду благодарен...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 10.01.2005, 12:03
#16
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>kos
Я вроде отправлял на kos***ring.by. Или куда следовало?
AY вне форума  
 
Автор темы   Непрочитано 10.01.2005, 12:07
#17
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Ящик kos@ring.by прекратил свое существование.
Внизу моих сообщений есть кнопочка "E-mail". Там все и написано...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 21.01.2005, 19:31
#18
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


>kos
А нельзя ли поподробнее о глобальной задаче с "поминутной тарификацией"?

Не будучи специалистом в ObjectARX (да и вобще я не профи в программировании), попробовал сделать вот что. Это только наброски, хотя, работает для одного сеанса АКАД и одного чертежа.... Чтоб не ждать минуту, сделал паузу 10 секунд.

Лисп, который будет отрабатываться в чертеже (файл timeout.lsp в корне диска С: ):
Код:
[Выделить все]
(setq timeglobal 0)
(defun c:timeout ()
  (princ "\nTime ")
  (princ (setq timeglobal (1+ timeglobal)))
  (princ)
)
Скрипт (файл с расширением WBS):
Код:
[Выделить все]
<Job id="MyTestTimeout">
<?job debug="true"?>
<script language="VBScript">

	Dim WshShell, acadObj
	Set WshShell = WScript.CreateObject("WScript.Shell")

	On Error Resume Next

	Do ' цикл поиска процесса АКАДа в памяти
		Err.Clear
		Set acadObj = GetObject(, "AutoCAD.Application.16") ' 16 = 2005 или 2004
		If Err.Number > 0 Then ' если АКАД не найден в памяти
			WScript.Sleep 5000 ' то подождать 5 секунд
		End If
	Loop While Err.Number > 0 ' если АКАД не найден в памяти повторить поиск
	
	WshShell.Popup "Start of the TIMEOUT commands...", 3
	Err.Clear

	acadObj.ActiveDocument.SendCommand "(load ""c:\\timeout.lsp"") " ' загрузить Лисп

	Do ' цикл отработки таймаута
		WScript.Sleep 10000 ' ждать 10 секунд 
		If acadObj.ActiveDocument.GetVariable("cmdactive") = 0 Then ' если нет активной команды
			acadObj.ActiveDocument.SendCommand "timeout " ' то заслать команду в АКАД
		End If
	Loop While Err.Number = 0 ' повторять, пока не возникла ошибка (АКАД или документ отсутствует)
		
	WshShell.Popup "The END", 10
</Script>
</Job>
Работает так: После запуска скрипт периодически ищет в памяти запущенный АКАД, подгружает туда Лиспик и каждые 10 секунд передает в АКАД команду. Если произойдет ошибка на этапе передачи команды - скрипт завершает работу. WshShell.Popup оставил исключительно в информационных целях - их можно убрать. Проверял на Windows2000.
vk вне форума  
 
Непрочитано 22.01.2005, 21:35
#19
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


[вырезано цензурой] (потирая шишку на лбу)
Почему то acadObj.ActiveDocument.GetVariable("cmdactive") не отрабатывает, если АКАД занят выполнением команды :?
Наверно надо обработку ошибки делать....
vk вне форума  
 
Непрочитано 15.03.2009, 18:00
#20
Diman111

промышл проектант
 
Регистрация: 26.05.2005
Изовсехщелей
Сообщений: 323


Хотел бы поднять тему.
Есть потребность выполнять функцию с интервалом в n милисекунд.
Описанное выше проблему не решает. Предложение с использованием библиотеки arx и импортом функции в лисп мне кажется решит проблему. Если есть бибилиотека - выложите ее, пожалуйста. Возможно есть иное решение?

Upd.
кому интересна библиотека с Delay.
http://www.caduser.ru/forum/index.ph...#message257395

Последний раз редактировалось Diman111, 15.03.2009 в 20:19.
Diman111 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как организовать событие "Закончилась минута"?

Реклама i