示例#1
0
文件: Writer.cs 项目: stovpyak/gzip
        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);
        }
示例#2
0
        // 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);
        }
示例#3
0
文件: Reader.cs 项目: stovpyak/gzip
        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;
            }
        }