private void Render() { while (!_stopped) { try { if (_syncQueue.Count > 0) { _currentCancellableArg = new CancellableRenderingEventArg(); Action <CancellableRenderingEventArg> currentAction = _syncQueue.Dequeue() as Action <CancellableRenderingEventArg>; currentAction(_currentCancellableArg); } if (_syncQueue.Count == 0) { _autoresetEvent.WaitOne(); } } catch (Exception e) { Debug.Write(e.Message, "Exception"); } } }
protected override void DrawFractalPoints(Brush brush, ITransformation transformation, RectangleF viewPort, IFractal fractal, Graphics g, CancellableRenderingEventArg cancellableArg) { //Less memory used, transforming and painting //foreach (var point in fractal.Points) //{ // if (cancellableArg.IsCancelled()) // return; // PointF p = transformation.Apply(point); // if (rectangle.Contains(p)) // g.FillRectangle(brush, p.X, p.Y, 2, 2); //} //Parallelize this DateTime start = DateTime.Now; var resultCollection = new ConcurrentBag <PointF>(); var points = fractal.Points; Parallel.ForEach(fractal.Points, (point) => { resultCollection.Add(transformation.Apply(point)); }); DateTime stop = DateTime.Now; TimeSpan ts = stop - start; LoggerProvider.Instance.Trace(fractal.Name + ": " + points.Count + "->" + ts.TotalMilliseconds); foreach (var p in resultCollection) { if (cancellableArg.IsCancelled()) { return; } if (viewPort.Contains(p)) { g.FillRectangle(brush, p.X, p.Y, 1, 1); } } }
protected abstract void DrawFractalPoints(Brush brush, ITransformation transformation, RectangleF viewPort, IFractal fractal, Graphics g, CancellableRenderingEventArg cancellableArg);
protected override void DrawFractalPoints(Brush brush, ITransformation transformation, RectangleF viewPort, IFractal fractal, Graphics g, CancellableRenderingEventArg cancellableArg) { //Less memory used, transforming and painting try { foreach (var point in fractal.Points) { if (cancellableArg.IsCancelled()) { return; } PointF p = transformation.Apply(point); if (viewPort.Contains(p)) { g.FillRectangle(brush, p.X, p.Y, 1, 1); } } } catch (Exception e)//If closing the view while still drawing, { } }