I think I know why setstyle double buffering cases invalidOperationExceptions!
- From: "Garry Freemyer" <garryfre@xxxxxxxxxxxxxxxxxxx>
- Date: Mon, 20 Jun 2005 00:22:45 -0700
Here is some of the points and observations about my screensaver, where I am
being tortured by the InvalidOperationException raised from
System.Graphics.EndContainer(). Here is what I think is happening. Does the
stack trace below bear this out? Is there a method to tell the control when
to copy it's backbuffer to the screen, and when NOT to, but to wait?
1. The manual double buffering never crashes. In this kind of buffering
there is no double buffer between the graphics object, and the display, and
so there is no guess work about when the drawn lines and Images that are
loaded and displayed because they are loaded when the paint event argument
is told to load the image, it displays it right away.
2. I noticed that even tho I specify a particular swarm to appear on screen,
instead of appearing within seconds of each other because the drawing is
fast. So, things drawn are not displayed immediately when using the SetStyle
DoubleBuffer, true);
3. The contol's built in double buffering is automatic in that the control
has a backbuffer, that you have little control over! In this scenario the
control has to guess when it's time to copy the backbuffer to the display
and also guess when it's time to clear it's backbuffer and the only metric
it has, is a couple of hints in the flush method, and the next slot of idle
time.
So, that's it!! The control under double-buffering via the setstyle is
deciding to flush the buffer out to the screen just before my program tries
to start drawing to it! The control tries to end container on the bitmap,
but the bitmap is still being drawn to!
This would explain the delaytime where I have seven swarms on the screen,
but one only appears every 4 seconds, till they are all on-screen.
If this is raising an event, that eventually turns into a paint event, then,
the thread could be blocking itself by invoking threads.
So, the event is being caused by the bad guesswork about when a buffer is to
be drawn and disposed of! In every error there is this message about
something trying to access the buffer while it's being disposed!
Since this drawing is so fast, it also explains why it can take hours for
the exception to show its ugly face because the program is like a slightly
drunken person tripping over it's own feet!
I'm a bit surprised that there aren't or that I've not found in any
double-buffering articles, a command to tell the graphic to stop guessing
around and copy and dispose of the backbuffer when I tell it that it's time
to.
Here is the trace ...
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.
at System.Drawing.Graphics.EndContainer(GraphicsContainer container)
at
System.Windows.Forms.DibGraphicsBufferManager.ReleaseBuffer(GraphicsBuffer
buffer)
at System.Windows.Forms.GraphicsBuffer.Dispose()
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)
--
To reply to this message take off the .NoJunkSpam off of the end of
garryfre@xxxxxxxxxxxxxxxxxxxxxx
.
- Follow-Ups:
- Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- From: Frank Hileman
- Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- From: Bob Powell [MVP]
- Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- From: Josh
- Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- Prev by Date: Re: Repaint form?
- Next by Date: Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- Previous by thread: Thank You
- Next by thread: Re: I think I know why setstyle double buffering cases invalidOperationExceptions!
- Index(es):
Relevant Pages
|