Пример, прямой 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, как избежать этой проблемы?