Пример #1
0
        /// <summary>
        /// Search
        /// </summary>
        private async void buttonSearch_Click_1(object sender, EventArgs e)
        {
            if (!CheckInputData()) return;
            if (logElements == null)
            {
                Log("Please select correct log file.");
                return;
            }
            
            foreach (var mainSign in mainSigns)
            {
                    // Время начала берется из названия файла, а длительность - длительность файла
                DateTime timeBegin;
                if (!TrySignNameAsDateTime(mainSign.ToString(), out timeBegin))
                {
                    Log("Error: Cannot recognize time stamp in filename " + mainSign.ToString());
                    continue;
                }
                TimeInterval mainInterval = new TimeInterval(timeBegin, mainSign.ToTimeSpan());
                Log(String.Format("Search on {0} ({1}):", mainSign.ToString(), mainSign.ToTimeSpan()));

                    // Перебираем все записи из этого интервала                    
                List<LogElement> _elems = logElements.Where((logElement) =>
                    {
                        if (mainInterval.Within(new TimeInterval(logElement.Begin, logElement.Length)))
                        {
                            Log(logElement.ToString());
                            return true;
                        }
                        return false;
                    }).ToList();
                Log(String.Format("{0} elements on time interval {1}", _elems.Count, mainInterval.ToString()));
                if (_elems.Count < 1) continue;

                    // Сопоставляем каждой записи сигнатуру
                List<Signature> _signs = new List<Signature>();
                List<LogElement> _notFoundElems = new List<LogElement>();
                foreach (var elem in _elems)
                {
                    try { _signs.Add(dictSigns[elem.ElemName]); }
                    catch (KeyNotFoundException) { _notFoundElems.Add(elem); }
                }
                    // Выводим информацию об этом
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("Got {0}/{1} files.", _signs.Count, _elems.Count);
                if (_notFoundElems.Count > 0)
                {
                    sb.Append(" Not found: " + Environment.NewLine);
                    foreach (var elem in _notFoundElems) sb.AppendLine(elem.ToString());
                }
                else sb.AppendLine();
                Log(sb.ToString());

                    // Сравниваем
                Congruence[] _congs = await CompareParallel(mainSign, _signs.Distinct().ToArray());

                    // Обрабатываем результаты сравнения
                float[] dtime = new float[_elems.Count];
                for (int i = 0; i < _elems.Count; i++) dtime[i] = float.NaN;
                if (_congs != null)
                {
                    for (int i = 0; i < _elems.Count; i++)
                    {
                        foreach (var cong in _congs)
                        {
                            if (cong.SignLink.ToString() == _elems[i].ElemName)
                            {
                                TimeSpan _timeBegin = timeBegin.Add(mainSign.ToTimeSpan(cong.Begin)).TimeOfDay;
                                float delta = (float)_elems[i].Begin.TimeOfDay.Subtract(_timeBegin).TotalSeconds;
                                if (float.IsNaN(dtime[i]) || (Math.Abs(delta) < Math.Abs(dtime[i]))) 
                                    dtime[i] = delta;
                            }
                        }
                    }
                }

                    // Выводим результаты
                sb = new StringBuilder();
                sb.AppendLine("File " + mainSign.ToString() + ":");
                for (int i = 0; i < _elems.Count; i++)
                {
                    sb.AppendFormat("[{0:T}]: ", _elems[i].Begin);
                    if (float.IsNaN(dtime[i])) sb.Append("Failed; ");
                    else sb.AppendFormat("Success (dev. {0}); ", TimeSpan.FromSeconds(Math.Abs(dtime[i])));
                    sb.AppendLine(_elems[i].ElemName);
                }
                Result(sb.ToString());
                Log(sb.ToString());
            }
        }
Пример #2
0
 public bool Within(TimeInterval interval)
 {
     return (Begin.TimeOfDay <= interval.Begin.TimeOfDay)
             && (End.TimeOfDay >= interval.End.TimeOfDay);
 }