отладка sbcl cl-gtk2-gk, если серверный поток зависает - PullRequest
2 голосов
/ 05 апреля 2011

Пример, прямой gtk2 в главном цикле

В настоящее время я пытаюсь добавить код на событие нажатия клавиши

Если я сделаю ошибку в коде парня, поток gui будет зависать в repl, я все еще могу вернуть ответ, но я не нашел способа продолжить разработку gui без перезапуска sbcl и перезагрузки всех пакетов.

(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 в потоке #: Не существует применимого метода для универсальной функции # когда вызывается с аргументами (NIL).

Имея достаточно работы, я могу исправить ошибку, но каждый раз, когда что-то ломается в графическом интерфейсе, я не могу заставить внутренний поток продолжить с того места, где он завис. Я перепробовал все виды функций потоков. 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, как избежать этой проблемы?

1 Ответ

4 голосов
/ 05 апреля 2011

Используйте sb-thread:release-foreground для переключения между потоками, ожидающими ввода. См. Потоки в SBCL для примера сеанса.

...