/// <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); } }
/// <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); } }