Changeset 8604


Ignore:
Timestamp:
Feb 9, 2020, 12:27:15 AM (2 years ago)
Author:
Sven Rech
Message:

Primes tutorial: Optimized drawing and info displaying of "amount of primes" values.

Location:
trunk/CrypPlugins/Primes/Primes/WpfControls
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/Primes/Primes/WpfControls/PrimesDistribution/Graph/GraphControl.xaml.cs

    r8603 r8604  
    2828using Primes.WpfControls.Components;
    2929using Primes.WpfControls.Threads;
     30using System.Threading.Tasks;
    3031
    3132namespace Primes.WpfControls.PrimesDistribution.Graph
     
    133134        }
    134135
    135         void m_FunctionPix_Executed(object obj)
    136         {
     136        private int functionPixExecutedSeqNo;
     137
     138        async void m_FunctionPix_Executed(object obj)
     139        {
     140            var thisSeqNo = ++functionPixExecutedSeqNo;
     141            if (thisSeqNo % 1000 > 0)
     142            {
     143                //Optimization: Wait a little bit and only proceed if this method has not been called again in the meantime:
     144                await Task.Delay(TimeSpan.FromSeconds(0.2));
     145                if (thisSeqNo != functionPixExecutedSeqNo)
     146                {
     147                    //Method has been called in the meantime (with more recent infos), so we don't do anything:
     148                    return;
     149                }
     150            }
     151
    137152            if (PrimesCountList.Initialzed && m_To.LongValue <= PrimesCountList.MaxNumber)
    138153            {
     
    144159                SetInfo(tbInfoPiX, obj);
    145160            }
     161
    146162        }
    147163
  • trunk/CrypPlugins/Primes/Primes/WpfControls/Threads/FunctionThread.cs

    r8602 r8604  
    2121using Primes.WpfControls.PrimesDistribution.Graph;
    2222using Primes.Bignum;
     23using System.Collections.Generic;
     24using System.Linq;
    2325
    2426namespace Primes.WpfControls.Threads
     
    128130            PrimesBigInteger inci = PrimesBigInteger.One;
    129131            PrimesBigInteger div = (fe.Range.RangeAmount.CompareTo(PrimesBigInteger.ValueOf(10000)) > 0) ? PrimesBigInteger.Ten : PrimesBigInteger.OneHundred;
     132            bool approximate = (fe.Range.RangeAmount.CompareTo(PrimesBigInteger.ValueOf(10000)) > 0);
    130133            if (fe.Range.RangeAmount.CompareTo(PrimesBigInteger.ValueOf(1000)) > 0 && fe.Function.CanEstimate)
    131134            {
     
    133136                incX = inci;
    134137            }
     138
     139            var lineSegments = new List<LineParameters>();
    135140
    136141            PrimesBigInteger i = m_From;
     
    168173                            x2 -= double.Parse(incX.ToString());
    169174                        }
    170                         if (!DrawLine(x1, x2, formerY, y, fe.Color, fe.Function)) break;
     175                        lineSegments.Add(new LineParameters(x1, x2, formerY, y, fe.Color, fe.Function));
     176                        //if (!DrawLine(x1, x2, formerY, y, fe.Color, fe.Function)) break;
    171177                        if (drawstair)
    172178                        {
    173179                            x2 += double.Parse(incX.ToString());
    174                             if (!DrawLine(x1, x2, y, y, fe.Color, fe.Function)) break;
     180                            lineSegments.Add(new LineParameters(x1, x2, y, y, fe.Color, fe.Function));
     181                            //if (!DrawLine(x1, x2, y, y, fe.Color, fe.Function)) break;
    175182                        }
    176183                    }
     
    185192                }
    186193                i = i.Add(inci);
     194
     195                if (lineSegments.Count > 10 * div)
     196                {
     197                    DrawLines(lineSegments, approximate);
     198                    lineSegments.Clear();
     199                }
     200            }
     201
     202            DrawLines(lineSegments, approximate);
     203        }
     204
     205        private bool DrawLines_Internal(IEnumerable<LineParameters> lineParameters)
     206        {
     207            foreach (var lineParameter in lineParameters)
     208            {
     209                if (!m_DrawLine(lineParameter).BoolValue)
     210                {
     211                    return false;
     212                }
     213            }
     214            return true;
     215        }
     216
     217        private bool DrawLines(IEnumerable<LineParameters> lineParameters, bool approximate)
     218        {
     219            if (approximate)
     220            {
     221                var first = lineParameters.First();
     222                var last = lineParameters.Last();
     223                return DrawLine(first.X1, last.X2, first.Y1, last.Y2, first.Color, first.Function);
     224            }
     225            else
     226            {
     227                return (bool)this.m_Dispatcher.Invoke(
     228                    DispatcherPriority.Send,
     229                    new Func<IEnumerable<LineParameters>, bool>(DrawLines_Internal),
     230                    lineParameters);
    187231            }
    188232        }
     
    191235        {
    192236            LineParameters lineparams = new LineParameters(x1, x2, formerY, y, color, function);
    193             BoolWrapper result = this.m_Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Send, m_DrawLine, lineparams) as BoolWrapper;
     237            BoolWrapper result = this.m_Dispatcher.Invoke(DispatcherPriority.Send, m_DrawLine, lineparams) as BoolWrapper;
    194238            return (result != null) ? result.BoolValue : false;
    195239        }
Note: See TracChangeset for help on using the changeset viewer.