[ltk-user] listbox updates from separate thread

Kevin Raison raison at chatsubo.net
Tue Dec 14 09:23:20 UTC 2010


I have a listbox that needs to be updated periodically by a separate 
thread.  However, I am having trouble figuring out how to make that 
happen.  This code fails with a stream error, probably because the wish 
stream is not accessible to the spawned thread:

(ltk:with-ltk (:debug 3)
     (let* ((update-threads nil)
            (f (make-instance 'ltk:frame))
            (m1 (ltk:make-menubar))
            (mf (ltk:make-menu m1 "File"))
            (call-queue-listbox
             (make-instance 'ltk:listbox :name "call_q"
                            :master f :width 30 :height 12))
            (exit-fn #'(lambda ()
                         (setq *shutdown-gui* t)
                         (dolist (thread update-threads)
                           (join-thread thread))
                         (setq update-threads nil)
                         (setf ltk:*exit-mainloop* t)))
            (mf-exit (ltk:make-menubutton mf "Quit" exit-fn)))
       (ltk:pack f)
       (ltk:grid call-queue-listbox 0 0)
       (ltk:bind ltk:*tk* "<Alt-q>"
                 (lambda (event)
                   (declare (ignore event)) (funcall exit-fn)))
       (push (make-thread
              #'(lambda ()
                   (loop until *shutdown-gui*
                       do
                       (ltk:listbox-clear call-queue-listbox)
                       (dotimes (i (random 10))
                         (ltk:listbox-append
                            call-queue-listbox
                            (format nil "call ~A in queue" i)))
                       (sleep 1))))
             update-threads)))

Can someone show me the correct ltk idiom for this?

Thanks!

-Kevin




More information about the ltk-user mailing list