4

我有一个运行很长时间的程序,我想中断它,但不是用 ctrl-c ctrl-c。我也不希望系统经常等待击键。相反,如果我确实按下了一个键,我希望它把东西包装起来并退出。我找到了listenread-char-no-hang但我无法让它正常工作。这是我试图做的

(let ((f nil))
  (loop while (not f) do
     (if (listen)
       (setf f t)))))

显然,就查找 key=-presses 而言,这在 Xanax 上做得还不够。我究竟做错了什么?

4

2 回答 2

1

我相信 CCL​​ 具有多线程。您可以尝试在后台生成一个工作线程并让一个控制线程进行阻塞读取,然后通过一个特殊变量进行通信。以下工作在 Lispworks 中,我没有可用的 CCL。您必须将 mp:process-run-function 转换为 CCL 用于生成线程的任何内容:

(defparameter *f* nil)
(defun cmd-loop ()
  (setf *f* nil)
  (mp:process-run-function "work" () #'do-work)  ; Spawn worker
  (read-char *terminal-io*)                      ; Blocking read
  (setf *f* t))
(defun do-work ()
  (loop while (not *f*)
        do 
          (format t "~a " *f*)
          (finish-output)))
(cmd-loop)

我在这里做出的最大假设是 CCL 多线程的工作方式与 LW 多线程类似,因此两个线程都可以访问共享状态变量*f*

于 2011-06-30T21:52:41.523 回答
0

我用 SLIME 做这些事情。我通常像这样在远程计算机上启动 lisp:

whoplisp@laptop:~$ ssh -L4005:127.0.0.1:4005 remotecomputer
whoplisp@remotecomputer:~$ sbcl
(require :asdf)
(require :swank)
(setf swank:*dedicated-output-stream-port* nil)
(swank:create-server)

然后我可以从 emacs 中在笔记本电脑上启动一个 slime 会话:

M-x slime-connect
localhost
4005
C-x C-f /ssh:remotehost:project/test.lisp

您必须设置 TRAMP 才能正常工作。您还应该确保您有一个合理的 ssh 设置(如果您想远程工作)。将此添加到 /etc/ssh/ssh_config。它将加快许多 ssh 连接的握手速度。

Host remotehost
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p

但是,如果您只想让事情在本地机器上运行,那么一切都会容易得多。您可以重新连接 SLIME 并使用 Mx slime-list-threads 停止您之前在 lisp 映像中启动的作业。

于 2011-07-01T15:08:27.223 回答