/// <summary>
        /// Запустить распаковку заданного файла и сохранить по указанному пути
        /// </summary>
        /// <param name="readFile">
        /// Дескриптор файла для чтения
        /// </param>
        /// <param name="writeFile">
        /// Дескриптор файла для записи
        /// </param>
        public bool ProcessFile(FileDescriptor readFile, FileDescriptor writeFile)
        {
            _compressTaskPool = new QueueTaskPool();
            _writeTaskPool    = new HashtableTaskPool();

            try
            {
                // Запуск потока чтения
                {
                    Thread thread = new Thread(ReadingThread);
                    thread.Start(readFile);
                }
                // Запустить потоки распаковки
                for (int i = 0; i < _cores; ++i)
                {
                    Thread thread = new Thread(DecompressingThread);
                    thread.Start();
                }
                // Запустить поток записи
                {
                    Thread thread = new Thread(WritingThread);
                    thread.Start(writeFile);
                }

                // Ждать, пока не завершится последний кусок и обновлять прогресс
                while ((_isReading || _lastWritenBlock < _batchCount) && !_cancellationToken.IsCancellationRequested)
                {
#if !DEBUG
                    Console.Clear();
#endif
                    Console.WriteLine("Press Ctrl+C for cancellation");
                    // Здесь должно высылаться оповещение контроллеру, чтобы тот обновил на GUI прогресс бар (W.I.P.) =]
                    Console.WriteLine("Progress: {0}%", Convert.ToInt32(_position / (double)_fileLength * 100));
                    Thread.Sleep(500);
                }

                if (_cancellationToken.IsCancellationRequested)
                {
                    Console.WriteLine("Decompression cancelled");
                    return(false);
                }

#if !DEBUG
                Console.Clear();
#endif
                Console.WriteLine("Decompression completed");
                return(true);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Can't process threads");
#if DEBUG
                Console.WriteLine(exc);
#endif
                return(false);
            }
        }
示例#2
0
        /// <summary>
        /// Запустить сжатие заданного файла и сохранить по указанному пути
        /// </summary>
        /// <param name="readFile">
        /// Дескриптор файла для чтения
        /// </param>
        /// <param name="writeFile">
        /// Дескриптор файла для записи
        /// </param>
        public bool ProcessFile(FileDescriptor readFile, FileDescriptor writeFile)
        {
            _readTaskPool     = new QueueTaskPool();
            _compressTaskPool = new QueueTaskPool();
            _writeTaskPool    = new HashtableTaskPool();

            /// Длина исходного файла
            Int64 _fileLength = readFile.GetDescription.Length;

            // Количество целых кусков
            _batchCount = _fileLength / _readBlockSize;
            // Длина последнего куска
            _lastPiece = _fileLength % _readBlockSize;
            // Общее количество кусков с учётом последнего
            _totalCount = _batchCount;

            if (_lastPiece > 0)
            {
                _totalCount++;
            }

            try
            {
                // Запуск потока чтения
                Thread readingThread = new Thread(ReadingThread);
                readingThread.Start(readFile);

                // Запустить потоки распаковки
                for (int i = 0; i < _cores; ++i)
                {
                    Thread compressingThread = new Thread(CompressingThread);
                    compressingThread.Start();
                }

                // Запустить поток записи
                Thread writingThread = new Thread(WritingThread);
                writingThread.Start(writeFile);

                // Запуск потока генерации задач
                Thread generatorThread = new Thread(GeneratorThread);
                generatorThread.Start();

                // Наблюдатель - ждёт, пока не завершится последний кусок и обновляет прогресс
                while (_lastWritedBlock < _totalCount && !_cancellationToken.IsCancellationRequested)
                {
#if !DEBUG
                    Console.Clear();
#endif
                    Console.WriteLine("Press Ctrl+C for cancellation");
                    // Здесь должно высылаться оповещение контроллеру, чтобы тот обновил на GUI прогресс бар (W.I.P.) =]
                    Console.WriteLine("Progress: {0}%", Math.Truncate(_lastWritedBlock / (double)_totalCount * 100));
                    Thread.Sleep(500);
                }

                if (_cancellationToken.IsCancellationRequested)
                {
                    Console.WriteLine("Compression cancelled");
                    return(false);
                }

#if !DEBUG
                Console.Clear();
#endif
                Console.WriteLine("Compression completed");
                return(true);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Can't process threads");
#if DEBUG
                Console.WriteLine(exc);
#endif
                return(false);
            }
        }