private void Init(CompressionParams @params, CancellationToken cancellationToken)
        {
            _params = @params;

            _readThread = new Thread(() => Wrap <ReadException>(() => ReadInternal(_params.InputPath, cancellationToken)));
            _readThread.IsBackground = true;

            _writeThread = new Thread(() => Wrap <WriteException>(() => WriteInternal(_params.OutputPath, cancellationToken)));
            _writeThread.IsBackground = true;

            var queueLimit = Environment.ProcessorCount;

            // set limit for queues
            _inputQueue  = new SafeIndexQueue <byte[]>(queueLimit * 2);
            _outputQueue = new SafeIndexQueue <byte[]>(queueLimit * 2);

            var processThreadsCount = GetOptimalThreadsCount();

            _countdownEvent = new CountdownEvent(processThreadsCount);
            _processThreads = new Thread[processThreadsCount];
            for (var i = 0; i < processThreadsCount; i++)
            {
                _processThreads[i] = new Thread(() => Wrap <ProcessException>(() => ProcessInternal(cancellationToken)));
                _processThreads[i].IsBackground = true;
            }
        }
Exemple #2
0
 public void Execute(CompressionParams @params, CancellationToken cancellationToken)
 {
     using (var processor = GetProcessor(@params))
     {
         processor.Execute(@params, cancellationToken);
     }
 }
Exemple #3
0
        private BaseStreamProcessor GetProcessor(CompressionParams @params)
        {
            switch (@params.CommandType)
            {
            case CommandType.Compress:
                return(new Compressor());

            case CommandType.Decompress:
                return(new Decompressor());

            default:
                throw new InvalidOperationException("Unknown command type");
            }
        }
        public void Execute(CompressionParams @params, CancellationToken cancellationToken)
        {
            lock (_lockObj)
            {
                CheckDisposed();

                Validate(@params);

                Init(@params, cancellationToken);

                StartReadInBackground();

                StartProcessInBackground();

                StartWriteInBackground();

                WaitWriteComplete();
            }
        }
Exemple #5
0
        public static int Main(string[] args)
        {
            if (!CompressionParams.TryParse(args, out var @params))
            {
                Console.WriteLine("Error! Usage: ArchiveTest.exe <compress/decompress> <source path> <destination path>");
                return(1);
            }

            Console.CancelKeyPress += Handler;

            try
            {
                _gZipService.Execute(@params, _cancellationTokenSource.Token);
                return(0);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return(1);
            }
        }
        private void Validate(CompressionParams @params)
        {
            if (!File.Exists(@params.InputPath))
            {
                throw new FileNotFoundException("Source file should exists");
            }

            if (!File.Exists(@params.OutputPath))
            {
                return;
            }

            try
            {
                File.Delete(@params.OutputPath);
            }
            catch (Exception e)
            {
                throw new ValidationException("Destination file exists and couldn't be deleted", e);
            }
        }
        public void RunProcessManager(CompressionParams settings)
        {
            using (var reader = new FileStream(settings.SourceFile,
                                               FileMode.Open,
                                               FileAccess.Read,
                                               FileShare.Read,
                                               settings.BlockSize,
                                               FileOptions.Asynchronous))
            {
                using (var writer = new FileStream(settings.RecoverFileName,
                                                   FileMode.OpenOrCreate,
                                                   FileAccess.Write,
                                                   FileShare.Write,
                                                   settings.BlockSize,
                                                   FileOptions.Asynchronous))
                {
                    var readerWriter = readerWriterFactory.GetFileReaderWriter(reader, writer);
                    pool.StartThreadPool();
                    settings.Mode.Instruction.Processing(pool, readerWriter);

                    long res = 0, old = 0;
                    while (!pool.IsFinished())
                    {
                        Thread.Sleep(100);
                        if (!pool.QueueExceptionIsEmpty())
                        {
                            throw pool.GetThreadsException();
                        }
                        if (old < (res = (100 * reader.Position) / reader.Length))
                        {
                            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " Прогресс: " + (old = res) + "%");
                        }
                    }

                    settings.Mode.Instruction.PostProcessing(readerWriter);

                    pool.Stop();
                }
            }
        }
 public void Setup()
 {
     _params = new CompressionParams();
     _sut    = CreateSut();
 }