I am new to c # and trying to learn by writing some simple applications to familiarize myself with the syntax and the .NET library. The most recent mini-project I took is a polar watch similar to those found here .
One of the problems that I noticed in the early stages was that the application constantly βflickeredβ, which really removed from the presentation, so I read on the Internet about how to implement a double buffer that fixed this problem, but might have or not have something to do with the problem. Here is my onPaint method; it is called every 33 ms (~ 30 FPS) using a timer. Most of the rest of the application is just handlers for dragging and dropping the application (since it is frameless and with a transparent background), double-click exit, etc.
protected override void OnPaint(PaintEventArgs e) { DateTime now = DateTime.Now; float secondAngle = now.Second / 60F; secondAngle += (now.Millisecond / 1000F) * (1F / 60F); float minuteAngle = now.Minute / 60F; minuteAngle += secondAngle / 60F; float hourAngle = now.Hour / 24F; hourAngle += minuteAngle / 60F; float dayOfYearAngle = now.DayOfYear / (365F + (now.Year % 4 == 0 ? 1F : 0F)); dayOfYearAngle += hourAngle / 24F; float dayOfWeekAngle = (float)(now.DayOfWeek + 1) / 7F; dayOfWeekAngle += hourAngle / 24F; float dayOfMonthAngle = (float)now.Day / (float)DateTime.DaysInMonth(now.Year, now.Month); dayOfMonthAngle += hourAngle / 24F; float monthAngle = now.Month / 12F; monthAngle += dayOfMonthAngle / (float)DateTime.DaysInMonth(now.Year, now.Month); float currentPos = brushWidth / 2F; float[] angles = { secondAngle, minuteAngle, hourAngle, dayOfYearAngle, dayOfWeekAngle, dayOfMonthAngle, monthAngle }; SolidBrush DateInfo = new SolidBrush(Color.Black); SolidBrush background = new SolidBrush(Color.Gray); Pen lineColor = new Pen(Color.Blue, brushWidth); Font DateFont = new Font("Arial", 12); if (_backBuffer == null) { _backBuffer = new Bitmap(this.Width, this.Height); } Graphics g = Graphics.FromImage(_backBuffer); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; try { g.Clear(Color.White); if (_mouseIsOver) { g.FillEllipse(background, new Rectangle(0, 0, this.Width, this.Height)); } foreach (float angle in angles) { g.DrawArc( lineColor, currentPos, currentPos, this.Height - currentPos * 2, this.Width - currentPos * 2, startAngle, angle * 360F ); currentPos += brushWidth + spaceStep; } // Text - Seconds g.DrawString(String.Format("{0:D2} s", now.Second), DateFont, DateInfo, new PointF(115F, 0F)); g.DrawString(String.Format("{0:D2} m", now.Minute), DateFont, DateInfo, new PointF(115F, 20F)); g.DrawString(String.Format("{0:D2} h", now.Hour), DateFont, DateInfo, new PointF(115F, 40F)); g.DrawString(String.Format("{0:D3}", now.DayOfYear), DateFont, DateInfo, new PointF(115F, 60F)); g.DrawString(now.ToString("ddd"), DateFont, DateInfo, new PointF(115F, 80F)); g.DrawString(String.Format("{0:D2} d", now.Day), DateFont, DateInfo, new PointF(115F, 100F)); g.DrawString(now.ToString("MMM"), DateFont, DateInfo, new PointF(115F, 120F)); g.DrawString(now.ToString("yyyy"), DateFont, DateInfo, new PointF(115F, 140F)); e.Graphics.DrawImageUnscaled(_backBuffer, 0, 0); } finally { g.Dispose(); DateInfo.Dispose(); background.Dispose(); DateFont.Dispose(); lineColor.Dispose(); } //base.OnPaint(e); } protected override void OnPaintBackground(PaintEventArgs e) { //base.OnPaintBackground(e); } protected override void OnResize(EventArgs e) { if (_backBuffer != null) { _backBuffer.Dispose(); _backBuffer = null; } base.OnResize(e); }
I thought that getting rid of everything at the end of the method, I would be safe, but it does not seem to help. In addition, the interval between runtime and OutOfMemoryException is not constant; once it happened in just a few seconds, but it usually takes a minute or two. Here are some class variable declarations.
private Bitmap _backBuffer; private float startAngle = -91F; private float brushWidth = 14; private float spaceStep = 6;
And a screenshot (edit: links to a screenshot with a code view):

(source: ggot.org )
UPDATE: Stacktrace!
System.OutOfMemoryException: Out of memory. at System.Drawing.Graphics.CheckErrorStatus(Int32 status) at System.Drawing.Graphics.DrawArc(Pen pen, Single x, Single y, Single width, Single height, Single startAngle, Single sweepAngle) at PolarClock.clockActual.OnPaint(PaintEventArgs e) in C:\Redacted\PolarClock\clockActual.cs:line 111 at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
This seems to be the same line in which it crashed the last time, the main drawArc inside the loop.