protected override bool ProcessPart(FilePart part) { Logger.Add($"Поток {Thread.CurrentThread.Name} получил part {part}"); var stopWatch = new Stopwatch(); stopWatch.Start(); if (_targetStream == null) { _targetStream = File.Create(_targetFileNameProvider.GetFileName()); } _targetStream.Write(part.Result, 0, part.Result.Length); _currentPartIndex++; stopWatch.Stop(); Logger.Add($"Поток {Thread.CurrentThread.Name} записал part {part} за {stopWatch.ElapsedMilliseconds} ms"); part.Result = null; // он теперь не нужен NextQueue?.Add(part); if (part.IsLast) { Logger.Add($"Поток {Thread.CurrentThread.Name} записал последнюю part - это признак завершения работы"); // часть последняя - сам поток решает, что ему пора остановиться SetIsNeedStop(); // сообщаем, что работа завершена _stopEvent.Set(); } return(true); }
// Advances the game state forward in time public bool Update(Func <ActionResult> inputAction) { if (inputAction == null && !Player.HasNextStep) { return(false); } var characters = CurrentFloor.Entities.OfType <Character>().ToArray(); Ticks++; if (Ticks % RegenRate == 0) { foreach (var character in characters) { character.Regenerate(); } } Player.PendingAction = inputAction; Player.Update(this); NextQueue.Enqueue(Player, -Player.Sequence); if (CurrentQueue.Count == 0) { foreach (var character in CurrentFloor.Entities.OfType <Character>()) { CurrentQueue.Enqueue(character, -character.Sequence); } } while (CurrentQueue.Count != 0) { var current = CurrentQueue.Dequeue(); if (current is Player) { return(true); } var actionResult = current.Update(this); Log.LogActionResult(actionResult); NextQueue.Enqueue(current, -current.Sequence); } var tempQueue = CurrentQueue; CurrentQueue = NextQueue; NextQueue = tempQueue; NextQueue.Clear(); return(true); }
protected override bool ProcessPart(FilePart part) { if (_sourceStream == null) { var fileName = _sourceFileNameProvider.GetFileName(); _sourceStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); _partReader.Init(_sourceStream, new FileInfo(fileName).Length); } try { _processingStopwatch.Reset(); _processingStopwatch.Start(); if (_partReader.ReadPart(part)) { _processingStopwatch.Stop(); part.Index = _currentPartIndex; _currentPartIndex++; Logger.Add($"Поток {Thread.CurrentThread.Name} прочитал часть {part} {part.Source.Length} byte за {_processingStopwatch.ElapsedMilliseconds} ms"); NextQueue?.Add(part); // часть последняя - сам поток решает, что ему пора остановиться if (part.IsLast) { SetIsNeedStop(); } return(true); } Logger.Add($"!Поток {Thread.CurrentThread.Name} НЕ удалось прочитать часть {part}"); throw new Exception($"Не удалось прочитать часть {part}"); } catch (Exception) { Logger.Add($"Поток {Thread.CurrentThread.Name} - ошибка при чтении"); Close(); throw; } }