设置用户输入超时
有没有办法为用户输入设置倒计时?我试图在AutoCAD中创建一个CAD测试例程。一旦该命令被激活,它将询问15个问题,并在鼠标右键单击菜单下提供答案选项。但我必须设置最长30秒的时间从四个选项中选择答案。
代码在这里。如何设置倒计时?
(defun c:CADTEST()
(setq n 0)
(initget 1 "zoomDynamic zoomExtents zoomCenter zoomPan")
(setq Answer01 (getkword "Which one of the following commands allows simultaneous pan and zoom? "))
(if
(eq Answer01 "zoomDynamic")
(Progn
(alert "You are right...")
(setq n (1+ n))
)
(alert "Sorry, You are wrong...")
)
(alert (strcat "You scored " (itoa n) "/1"))
)
您可以通过读取日期系统变量并将其与参考值(进程开始时读取的日期)进行比较来计算时间。我不知道你怎么能把它和输入过程联系起来——如果超过允许的时间,就跳到下一个问题。也许只是设置一个超时答案(见下文)?
(setq RefTime (getvar “DATE”))
;{ask user for input}
(if (> (- (getvar “DATE”) RefTime) TimeLimit) (prompt ”Sorry, your answer exceeded allowed time!”))
也许有更好的方法,我会试着去想别的…
当做
米尔恰 msasu,非常感谢。。。我会试试。。。!!
在上面的例子中,我实际上想用空格来显示选项。比如,我想展示“Zoom Dynamic”而不是“Zoom_Dynamic”,有没有办法添加句子(单词之间有空格)作为initget函数的参数?
这是不可能的,因为空间保留为关键字分隔符。您可以使用GETSTRING而不是GETKWORD,但这将需要额外的代码来验证答案。
当做
米尔恰 好啊谢谢 由于LISP无法实现多线程,因此您无法在同时提示用户的同时监视时间,因此必须关注其中一个过程。
但是,您可以监控每个问题发出后的时间:
(defun c:测试(/\u lst->str \u askquestion-answers-answers-intime-question-questions-start-time)(设置时间10);;秒(defun \u lst->str(lst del/str)(setq str(car lst))(foreach x(cdr lst)(setq str(strcat str del x)))str)(defun \u askquestion(init ques)(initget(\u lst->str init“”)(getkword(strcat ques“[”(\u lst->str init”/“):”))(setq questions'((“男”“女”“其他”)“\nAre you”)((“苹果”“香蕉”“梨”)“\n你最喜欢哪种水果?”)((“红”“蓝”“绿”“黄”)“\n你最喜欢哪种颜色?”))(setq时间(*时间1000)(setq start(getvar’毫秒))(while(和(setq intime(<((getvar’毫秒)start)time))(setq QUEST(car QUESTS))(princ(strcat“\n剩余时间:”(RTO(/(-time(-getvar’毫秒)start))1000。)2.2)“秒。”)(if(setq-answer(apply'\u askquestion-question))(setq-answers(cons-answer-answers))(setq-answers(cons“No-answer”answers)))(setq-questions(cdr-questions)))(terpri)(if(not intime)(princ“\n===>超时! 谢谢你的密码李。。。!!!
我手头有东西要玩。谢谢。。。
这不是一个很好的例子,但它给了你一些如何实现目标的想法
页:
[1]