| allegro-cl archives 1994-11-7 | home index prev H thread prev K thread next J next L |
|
From: Ken Cheetham Subject: [pcspr1739] Nested Window in ACL/WINDOWS 2.0 Date: 1994-11-7 22:15
The questionaire is dynamic in that respect, that depending on the
answers the system may ask follow up questions, like in a decision
tree. We want to insert the new questions in the right place, so we
have to move all questions after the question that caused the follow
up question 1 step down and insert the question in the free place. So
assume that I have questions q1, q2, q3, q4 and want to insert q21
after q2, you have to move q3 and q4. Moving q3 or q4 obviously means
that we have to move all widgets that represent the questions.
Unfortunately moving a whole bunch of widgets may look, very, very
funny in Common Graphics before the window finally is really updated.
Yes, I've noticed such visual weirdness, which is due to the fact
the widgets drawn in the new place before they are erased from the
old place.
One can insert a couple of calls to update-window, to get a better
looking widget movement, but that slows down the whole process. Our
questionaires may consist of up to 150 questions with 5 to 10
one/multiple choice alternatives per qustion, moving that is really
slow, even on a fast 486.
I suppose that calling update-window on the dialog multiple times
would clear its background redundantly and thereby slow things down.
An obvious improvement that we also implemented in Macintosh Common
Lisp is to introduce subwindows for each question in the dialog . The
widgets for the question may then be added to the subwindow, not to
the main dialog. Then moving a qustion only means moving the
subwindow and not all individual widgets. Even the redisplay is
acceptable, so this solution works fine in principle.
But, the problem is that this solution does not scale up. Each
subwindow seams to consume quite a lot of system resources. I don't
know what system ressources are, but you can select help/info in the
programm manager to see the amount of free system ressources.
As far as I know, various such things as windows, strings, and bitmaps
are kept in 3 or 4 "resource tables" that are global for all of the
Windows applications that are running. These tables are arbitrarily
sized at 32K (or is it 64K?). The number reported by program
manager is alledgedly the lowest percentage of all 3 or 4 tables.
By experimentation I found that one can open about 100- 175 windows
before your system ressources are zero and a call to open-dialog fails
and returns nil.
But more than 100 questions can easily occur in one questionaire, so
it may happen (actually it happened with the knowledge base of our
project partner)
It sounds as though widgets aren't consuming the resources as badly as
the parent windows are that you are putting them on, but I don't know
why this would be since widgets are windows themselves. (Or are you
including widgets in your 100-175 number?)
One point to remember: be sure to not use bitmap-windows (and
bitmap-panes) unless you really need them since they consume a lot of
both resources and memory for their backing-store bitmaps.
Also be sure to call CLOSE on any windows no longer needed, so that
their resources are freed up.
Is there any other way to group the widgets togehter. Are there
perhaps ressorce free subwindows? May I increase the amount of memory
used in the operation system for the resources?
Below is a technique that I came up with just now which avoids
redundant redisplay, avoids using extra windows, and erases the new
background area of the dialog before drawing the widgets in their new
places. (I'm using a non-runtime function builder::shift-widget below
in place of whatever you use to change the dialog-item-box of each
widget.)
This technique is also faster than simply changing each widget's
dialog-item-box, but perhaps slower than moving fewer subwindows
with grouped widgets.
[This request has been assigned the tracking number pcspr1739.
For efficiency, please mention this number in the title of future
messages concerning it. Also please cc: <franz.com at bugs> so that
someone else can handle your message if I am away.]
Ken Cheetham, Franz Inc. 1995 University Avenue, Suite 275
internet: <franz.com at cheetham> Berkeley, CA 94704
uucp: ...uunet!franz!cheetham voice: (510) 548-3600
"It's later than it's ever been!" fax: (510) 548-8253
---------------------------------------------------------------------------
;; set-value-fn of the button Button-1
(defun temp1 (widget new-value old-value)
(let ((dialog (dialog-item-dialog widget))
)
(with-delayed-redraw (dialog)
(dolist (j (dialog-items dialog))
(bill::shift-widget j 20 20 t)))
(invalidate-window dialog)
(dolist (j (dialog-items dialog))
(invalidate-window (dialog-item-window j)))
)
(values t ;; Accept the new value
nil)) ;; Don't exit the dialog (if a pop-up)
|