Beispiel #1
0
        private void Calc()
        {
            OnStartCalc();
            Logger.logDebug("TimeSpreadCalculator.DoCalc_via_Time() begin");
            if (_callback.GetLineCount() > 1)
            {
                int lineNum     = 0;
                int lastLineNum = _callback.GetLineCount() - 1;
                _startTimestamp = _logWindow.GetTimestampForLineForward(ref lineNum, false);
                _endTimestamp   = _logWindow.GetTimestampForLine(ref lastLineNum, false);

                int timePerLineSum = 0;

                if (_startTimestamp != DateTime.MinValue && _endTimestamp != DateTime.MinValue)
                {
                    TimeSpan overallSpan       = _endTimestamp - _startTimestamp;
                    long     overallSpanMillis = overallSpan.Ticks / TimeSpan.TicksPerMillisecond;
                    DateTime oldTime           = _logWindow.GetTimestampForLineForward(ref lineNum, false);

                    long step = 1;
                    if (overallSpanMillis > DisplayHeight)
                    {
                        step = (long)Math.Round((double)overallSpanMillis / (double)DisplayHeight);
                    }

                    Logger.logDebug(string.Format("TimeSpreadCalculator.DoCalc_via_Time() time range is {0} ms", overallSpanMillis));

                    List <SpreadEntry> newDiffList = new List <SpreadEntry>();

                    int maxDiff = 0;

                    if (TimeMode)
                    {
                        DateTime searchTimeStamp = _startTimestamp;
                        int      oldLineNum      = lineNum;
                        int      loopCount       = 0;
                        int      lineDiffSum     = 0;
                        int      minDiff         = Int32.MaxValue;
                        _maxDiff = 0;
                        List <int> maxList = new List <int>();
                        while (searchTimeStamp.CompareTo(_endTimestamp) <= 0)
                        {
                            lineNum = _logWindow.FindTimestampLine_Internal(lineNum, lineNum, lastLineNum, searchTimeStamp, false);
                            if (lineNum < 0)
                            {
                                lineNum = -lineNum;
                            }
                            int lineDiff = lineNum - oldLineNum;
                                                        #if DEBUG
                            Logger.logDebug(string.Format("TimeSpreadCalculator.DoCalc_via_Time() test time {0} line diff={1}", searchTimeStamp.ToString("HH:mm:ss.fff"), lineDiff));
                                                        #endif
                            if (lineDiff >= 0)
                            {
                                lineDiffSum += lineDiff;
                                newDiffList.Add(new SpreadEntry(lineNum, lineDiff, searchTimeStamp));
                                if (lineDiff < minDiff)
                                {
                                    minDiff = lineDiff;
                                }
                                if (lineDiff > maxDiff)
                                {
                                    maxDiff = lineDiff;
                                }
                                maxList.Add(lineDiff);
                                loopCount++;
                            }
                            searchTimeStamp = searchTimeStamp.AddMilliseconds(step);
                            oldLineNum      = lineNum;
                            //LineNum++;
                        }
                        if (maxList.Count > 3)
                        {
                            maxList.Sort();
                            maxDiff = maxList[maxList.Count - 3];
                        }
                        _average = (double)lineDiffSum / (double)loopCount;

                        Logger.logDebug(string.Format("Average diff={0} minDiff={1} maxDiff={2}", _average, minDiff, maxDiff));

                        if (newDiffList.Count > 0)
                        {
                            newDiffList.RemoveAt(0);
                        }
                        if (newDiffList.Count > 0)
                        {
                            newDiffList.RemoveAt(0);
                        }

                        _maxDiff = maxDiff;
                    }
                    else
                    {
                        maxDiff = (int)Math.Round((double)overallSpanMillis / (double)_lineCount);
                        List <TimeSpan> maxList = new List <TimeSpan>();
                        lineNum++;
                        for (int i = lineNum; i < lastLineNum; i += (int)step)
                        {
                            int      currLineNum = i;
                            DateTime time        = _logWindow.GetTimestampForLineForward(ref currLineNum, false);
                            if (time != DateTime.MinValue)
                            {
                                TimeSpan span = time - oldTime;
                                maxList.Add(span);
                                timePerLineSum += (int)(span.Ticks / TimeSpan.TicksPerMillisecond);
                                newDiffList.Add(new SpreadEntry(i, 0, time));
                                oldTime = time;
                                Logger.logDebug(string.Format("TimeSpreadCalculator.DoCalc() time diff {0}", span));
                            }
                        }

                        maxDiff = (int)Math.Round((double)timePerLineSum / ((double)(lastLineNum + 1) / (double)step));

                        if (maxList.Count > 3)
                        {
                            maxList.Sort();
                            _maxSpan = maxList[maxList.Count - 3];
                        }

                        _timePerLine = maxDiff;
                    }
                    lock (_diffListLock)
                    {
                        DiffList = newDiffList;
                        if (TimeMode)
                        {
                            CalcValuesViaTime(maxDiff, _average);
                        }
                        else
                        {
                            CalcValuesViaLines(maxDiff);
                        }

                        Logger.logDebug("TimeSpreadCalculator.DoCalc() end");
                        OnCalcDone();
                    }
                }
            }
            else
            {
                Logger.logDebug("TimeSpreadCalculator.DoCalc() end because of line count < 1");
                OnCalcDone();
            }
        }