Progress bars
Hi
I have a problem with progress bars on LWM due to the single-threadness
of Cocoa.
Essentially I want to display a "progress bar" that advances
independently of the porcess it is tracking.
This is the code I wrote to make it work (and it works fine under LWW,
and at a certain point under LWL)
==================================================================================
(defun popup-progress-dialog (message &key (start 0) (end 100)
(cancel-button "Cancel") (title "Progress"))
(let ((pb (make-instance 'capi:progress-bar :start start :end end)))
(values pb
(mp:process-run-function "Progress bar process"
()
'capi:popup-confirmer
pb
message
:modal nil
:ok-button nil
:cancel-button cancel-button
:title title))))
(defun run-with-progress-dialog (funct message
&key
(start 0)
(end 100)
(cancel-button "Cancel")
(arguments ())
)
(let* ((pb (popup-progress-dialog message
:start start
:end end
:cancel-button cancel-button))
(pb-update-process
(mp:process-run-function "Progress bar updating"
()
(lambda ()
(loop with max = (capi:range-end pb)
for i from 0
do (sleep 1)
do (update-progress-bar pb
(mod i max))))))
)
(mp:ensure-process-cleanup
(lambda (funct-process)
(declare (ignore funct-process))
(mp:process-kill pb-update-process)
(popdown-progress-dialog pb))
(apply #'mp:process-run-function
"While progress bar is running"
()
funct
arguments))
nil))
==================================================================================
Even if I wrap the call to RUN-WITH-PROGRESS-DIALOG in a
EXECUTE-WITH-INTERFACE, LWM still hangs (due to the processes inside the
call I surmise)
Does anybody have some insights about how to write a cross-platform
progress dialog?
(I know I am lazy to ask here :) )
Thanks
--
Marco