sø., 15.03.2009 kl. 16.30 +0100, skrev Ramarren:
> On Sun, Mar 15, 2009 at 3:51 PM, Johan Ur Riise <jo...@riise-data.no> wrote:
> > #|
> > (cells-gtk:start-app 'my-app)
> > |#
> >
> > #|
> > (cgtk:with-widget (w :statebar) (setf (busy w) t))
> > |#
> 
> On my system at least cells-gtk:start-app blocks the repl, so how
> would you set the widget after that? 
I used slime, and executed one in the repl and one by C-x C-e in the
source window. That means two threads, but I also tried enclosing the
setf in cells-gtk:with-gdk-threads, with the same result

> When using cells-gtk:start-win it
> closes normally in both cases.

That is a lead, could be threads problem. Using start-win does not make
a difference.

> Anyway, as far as I can tell, cells have no thread-safety at all. The
> GTK parts do have locks to guarantee at most one thread accesses them
> at a time, but as far as I can tell the cells system doesn't, and it
> is quite possible to cause two conflicting datapulses, which means
> that all cell access, even with models completely separate from
> cells-gtk, have to be done through cells-gtk:with-gdk-threads. But
> this doesn't seem to related to your problem.

I tried to completely eliminate threads by creating a closure, putting
it on a global variable and starting it by way of cgtk:timeout-add. 

Also I tried to do it without slime.

Complete program:

(defparameter *run-in-main-thread* nil)
(defparameter *lock* (sb-thread:make-mutex))

(defun run-in-main ()
  (let ((func (sb-thread:with-mutex (*lock*) (pop
*run-in-main-thread*))))
    (when func (funcall func)
          (format t  "called~%") (terpri)))
  t)

(cells:defmodel statebar (cgtk:hbox) 
  ((busy :accessor busy :initform (cells:c-in nil)))
  (:default-initargs
      :md-name :statebar
      :kids (cgtk:kids-list?
             (cgtk:mk-label :text (if (busy cells:self) "Busy"
"NotBusy"))
             (cgtk:mk-label :markup (cgtk:with-markup (:background (if
(busy cells:self) :yellow :brown))
                            (if (busy cells:self) "Busy" "NotBusy"))))))

(cells:defmodel my-app (cells-gtk:gtk-app)
  ()
  (:default-initargs
    :kids (cells:c? (cells:the-kids 
                     (cells-gtk:mk-vbox 
                      :kids  (cells-gtk:kids-list?
                              (make-instance 'statebar :fm-parent
cells:*parent*)))))))


(defmethod initialize-instance :after ((self my-app) &rest initargs &key
&allow-other-keys)
  (declare (ignore initargs))
  (cgtk:timeout-add 50 #'run-in-main))


The error is now slightly different. I get an error saying something
about opengl and an error dialog when I try to close the window, and the
dialog says 

"Lisp Error: #<CELLS::C-LINK {C02D721}> cannot be printed readably.
Recklessly continue?"

Here is the console output.

ri...@morr:~/prg/tracklog$ rlwrap sbcl --core sbclgtk 
This is SBCL 1.0.26.1, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (load (compile-file "statebarex"))

; compiling file "/home/riise/prg/tracklog/statebarex.lisp" (written 15
MAR 2009 08:40:40 PM):
; compiling (DEFPARAMETER *RUN-IN-MAIN-THREAD* ...)
; compiling (DEFPARAMETER *LOCK* ...)
; compiling (DEFUN RUN-IN-MAIN ...)
; compiling (CELLS:DEFMODEL STATEBAR ...)
; compiling (CELLS:DEFMODEL MY-APP ...)
; compiling (DEFMETHOD INITIALIZE-INSTANCE ...)

; /home/riise/prg/tracklog/statebarex.fasl written
; compilation finished in 0:00:00.211
T
* (sb-thread:make-thread (lambda () (cells-gtk:start-win 'my-app)))

#<SB-THREAD:THREAD RUNNING {BFFA4C9}>
* libGL error: open DRM failed (Operation not permitted)
libGL error: reverting to (slow) indirect rendering

'a
"----------UTILSRESET----------------------------------" 
A
* (sb-thread:with-mutex (*lock*) (push (lambda () (cgtk:with-widget
(w :statebar) (setf (busy w) t))) *run-in-main-thread*))

(#<FUNCTION (LAMBDA #) {BF840BD}>)
* 
0> c-link> query link :statebar cells-store1 nilcalled

0> c-link> kick link :statebar cells-store1 
0> show error message
0> md-awaken :after
1> processing dlg
.2> running dialog
1> showed dialog -9 :no
1> destroying self (not-to-be)
0> >>>> ERROR REPORTING --> 
debugger invoked on a PRINT-NOT-READABLE in thread #<THREAD
"gtk-main-thread" RUNNING {C370CC1}>: #<PRINT-NOT-READABLE {C04EDA9}>
cannot be printed readably.

[1]+  Stopped                 rlwrap sbcl --core sbclgtk
ri...@morr:~/prg/tracklog$ kill %1

[1]+  Stopped                 rlwrap sbcl --core sbclgtk
ri...@morr:~/prg/tracklog$ 











_______________________________________________
cells-gtk-devel site list
cells-gtk-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/cells-gtk-devel

Reply via email to