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

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

Как организовать досрочный выход из цикла?

Ответ
Поиск в этой теме
Непрочитано 18.01.2010, 23:12
Как организовать досрочный выход из цикла?
[N.S]
 
инженер-дефектоскопист
 
Санкт-Петербург
Регистрация: 08.12.2006
Сообщений: 58

Как организовать досрочный выход из цикла по нажатию клавиши пользователем? Пробовал сделать через (grread T), но оказалось неприемлемо: вычисления останавливаются, ожидается действие пользователя.
Например, таким кодом можно накручивать мышкой или нажатием клавиш счетчик:
Код:
[Выделить все]
(setq do T i 0)
(while do
  ;;что-то делается
  (grtext (strcat "ЕДЕМ: " (itoa i)))
  (if (grread T) ;; ПРОВЕРКА?
      (setq do nil)
    )
  )
Чтобы счетчик мотал - нужно крутить педали..
А как можно сделать так, чтобы вычисления не останавливались в ожидании действий пользователя?
Просмотров: 11734
 
Непрочитано 21.01.2010, 13:18
#21
Елпанов Евгений

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


У меня 2008 en sp1.
А вообще, то же самое и в 2004 было.
Идея проста - grread ждет изменение последнего местоположения курсора, если нет изменений, дает старое значение после прописанного в функции времени...
Если есть изменение, значение возвращается мгновенно.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 21.01.2010, 14:26
#22
Do$

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


Offtop: То есть, если водишь курсором по экрану, программа будет быстрее работать!
Сомнительная затея с grread... При бездействии пользователя работа программы будет сильно заторможена, если число циклов измеряется тысячами - на каждые 1000 циклов 8 с лишним минут задержки. По мне, так проще каждую минуту останавливать работу программы и спрашивать пользователя: "Продолжить работу? Да/Нет"
Do$ вне форума  
 
Непрочитано 21.01.2010, 14:45
#23
Елпанов Евгений

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


Do$, немного не так, можно разместить grread пореже, чтоб он несколько раз в минуту появлялся. Тогда, при нажатии клавиши, значение клавиши отправится в grread но в отложенном виде, т.е. когда будет вызов, тогда и отправится туда значение нажатой клавиши.

В этом коде, при нажатии любой клавиши выход сразу!
Кстати, grread не делает задержку, если она уже организована самим кодом!
Пример, в коде общая задержка 20 секунд, т.е. 10 раз по 2 секунды...
Если замерить время работы этой программы, то оно и есть 20 секунд.
Другими словами, grread не отнимает времени!
Код:
[Выделить все]
(defun c:test ()
 (repeat 10
  (vl-cmdf "_.delay" 2000)
  (if (=(car (grread t 7 0)) 2)
   (exit)
  ) ;_  if
 ) ;_  repeat
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 21.01.2010, 17:16
#24
[N.S]

инженер-дефектоскопист
 
Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58


Do$
Код:
[Выделить все]
Сомнительная затея с grread...
Согласен.
Как насчет (acet-sys-keystate virt_key)? Пока опытным путем выяснил, что аргументом может быть 16 битовое целое (-32678; +32767). Посмотрел на msdn http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx значения Virtual Key, которые кстати HEX - (переводить в десятичную?). Пытался отловить "0" вот таким кодом
Код:
[Выделить все]
(defun c:test ( / last_state state i)
  (setq last_state nil
    i 0 r0 0 r1 0 r2 0 ret nil)
  (grtext)
    (cond
      ((/= (setq state (acet-sys-keystate 48)) last_state)
       (cond
            ((= state 0) (setq r0 (1+ r0)))
            ((= state 1) (setq r1 (1+ r1)))
            (T (setq r2 (1+ r2)))
       )
       (setq i (1+ i))
       (grtext -1 (itoa i))
       (setq last_state state)))
    )
  )
- не получается. Ведь "0" это 30hex и 48dec? Скрипт вроде должен выводить количество изменений состояния опрашиваемой вирт клавиши, но не получается. Что не верно?
Может подскажет кто как пользоваться acet-sys-keystate? Примеры бы какие..
[N.S] вне форума  
 
Непрочитано 26.06.2011, 18:18
#25
Павел Котелевец

проектирование
 
Регистрация: 02.08.2006
Ухта
Сообщений: 32


Где можно достать мануал по acetutils.arx версии 1.38?
Кругом 1.37 попадается...
Павел Котелевец вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как организовать досрочный выход из цикла?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Как именно настроить параметры нового чертежа? Макс_Северянин AutoCAD 31 01.09.2010 10:16
Как организовать событие "Закончилась минута"? kos Программирование 21 16.03.2009 12:31
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Как организовать линейный шарнир в Скаде SkiFF SCAD 4 26.03.2006 14:50