static private int StartProcessing(CompressionMode mode, string sourceFilePath, string targetFilePath)
        {
            NumberedQueue sourceBuffer = new NumberedQueue(_numberOfGzipThreads * 3);
            Reader        reader       = new Reader(sourceFilePath, sourceBuffer);
            Thread        readingThread;

            switch (mode)
            {
            case CompressionMode.Compress:
                readingThread = new Thread(reader.ReadUncompressedFile);
                break;

            case CompressionMode.Decompress:
                readingThread = new Thread(reader.ReadCompressedFile);
                break;

            default:
                throw new ArgumentOutOfRangeException("Parameter \"mode\" passed to " + System.Reflection.MethodInfo.GetCurrentMethod().Name + " method is out of range.");
            }
            readingThread.Start();

            NumberedQueue targetBuffer  = new NumberedQueue(_numberOfGzipThreads * 2);
            Writer        writer        = new Writer(targetFilePath, targetBuffer);
            Thread        writingThread = new Thread(writer.WriteResultToFile);

            writingThread.Start();

            GzipOperator[] gzipWorkers = new GzipOperator[_numberOfGzipThreads];
            Thread[]       gzipThreads = new Thread[_numberOfGzipThreads];
            for (int i = 0; i < _numberOfGzipThreads; i++)
            {
                gzipWorkers[i] = new GzipOperator(sourceBuffer, targetBuffer);
                switch (mode)
                {
                case CompressionMode.Compress:
                    gzipThreads[i] = new Thread(gzipWorkers[i].Compress);
                    break;

                case CompressionMode.Decompress:
                    gzipThreads[i] = new Thread(gzipWorkers[i].Decompress);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("Parameter \"mode\" passed to " + System.Reflection.MethodInfo.GetCurrentMethod().Name + " method is out of range.");
                }
                gzipThreads[i].Start();
            }

            writingThread.Join();
            Console.WriteLine("Process completed successfully. Press any key to exit.");
            Console.ReadKey(true);
            return(0);
        }
Exemple #2
0
 internal GzipOperator(NumberedQueue sourceBuffer, NumberedQueue targetBuffer)
 {
     _sourceBuffer = sourceBuffer;
     _targetBuffer = targetBuffer;
 }
        private int _blockCount = 0;  // Это поле используется для визуализации в консоли (для красоты).

        internal Writer(string filePath, NumberedQueue buffer) : base(buffer)
        {
            fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None);
        }
Exemple #4
0
 internal Reader(string filePath, NumberedQueue buffer) : base(buffer)
 {
     fs          = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
     _blockCount = 0;
 }
 internal FileUser(NumberedQueue buffer)
 {
     this.buffer = buffer;
 }