Пример #1
0
 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,
     {
     }
 }