【问题标题】:sbcl debugging cl-gtk2-gk if the backend thread hangs如果后端线程挂起,sbcl 调试 cl-gtk2-gk
【发布时间】:2011-04-04 23:07:53
【问题描述】:

一些示例,直接在主循环内使用 gtk2

我目前正在尝试在按键事件中添加代码

如果我在 Guy 代码中出错,gui 线程将挂在 repl 中,我仍然可以取回 repl,但我没有找到在不重新启动 sbcl 并重新加载所有包的情况下继续进行 gui 开发的方法

(defun run ()
  (within-main-loop
      ; match the controls that matter to vars
      (let ((window (builder-get-object builder "window"))
;....
           ; on window close keep the gtk running. helps with debugging
           (g-signal-connect search-field "key-press-event" (lambda (w) (declare (ignore w)) (format "~a" "danut")))
           (g-signal-connect window "destroy" (lambda (w) (declare (ignore w)) (leave-gtk-main)))
           (widget-show window)))))

我运行这个函数时得到的错误是:

  • 在线程 # 中的 SIMPLE-ERROR 上调用的调试器: 泛型函数没有适用的方法 # 带参数调用时 (无)。

通过足够的工作,我可以修复错误,但每次我在 gui 中遇到问题时,我都无法让后端线程从挂起的地方继续。 我尝试了各种线程函数。 list-all-treads 将显示:

(#<SB-THREAD:THREAD "cl-gtk2 main thread" RUNNING {CF48EF1}>
 #<SB-THREAD:THREAD "initial thread" RUNNING {AA5F591}>)

这就是我到目前为止所尝试的全部:

(sb-thread:list-all-threads)

(sb-thread:interrupt-thread (first (sb-thread:list-all-threads)) #'leave-gtk-main)

(sb-thread:terminate-thread (first (sb-thread:list-all-threads)))

我就是解不开。

您使用 cl-gtk2-gtk 的正常工作流程是什么,您如何避免这个问题?

【问题讨论】:

    标签: user-interface lisp common-lisp


    【解决方案1】:

    使用sb-thread:release-foreground 在等待输入的线程之间切换。有关示例会话,请参阅 Threads in SBCL

    【讨论】:

    • 谢谢。我没有足够的声望来支持你,但你应该得到 100 次支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多