Пример #1
0
        public void Zip(object o)
        {
            objW              = new ObjForWriter();
            memStream         = new MemoryStream(0);
            compressionStream = new GZipStream(memStream, CompressionMode.Compress);

            Monitor.Enter(ProgramManager.lock1);
            ObjForZipper objZ = (ObjForZipper)o;

            objW.readNumber = objZ.readNumber;

            byte[] arrayZ = new byte[objZ.array.Length];

            int p = 0;

            foreach (byte _byte in objZ.array)
            {
                arrayZ[p] = _byte;
                p++;
            }
            Monitor.Exit(ProgramManager.lock1);

            compressionStream.Write(arrayZ, 0, arrayZ.Length); // собственно, та нагрузка, котора параллелится
            objW.memoryPosition = (int)memStream.Position;
            objW.array          = memStream.ToArray();

            Monitor.Enter(ProgramManager.lock3); // блокирую коллекцию для загрузки в нее сжатого массива
            ProgramManager.list.Add(objW);
            Monitor.Exit(ProgramManager.lock3);
        }
Пример #2
0
        public void Compress()
        {
            Thread thread = new Thread(writer.WriteToFile);

            thread.Start();

            while (i < reader.sourceStream.Length)
            {
                Monitor.Enter(lock2);
                for (int c = 0; c < 3; c++)
                {
                    Console.WriteLine(i);
                    Thread thread2 = new Thread(new ParameterizedThreadStart(zipper.Zip));
                    threads.Add(thread2);

                    Monitor.Enter(lock1);
                    objZ = reader.ReadPortion();
                    thread2.Start(objZ);
                    Monitor.Exit(lock1);

                    i += size;

                    Thread.Sleep(200);// ждем запуск потока чтоб он захватил лок1
                }
                Monitor.Exit(lock2);
            }
            do
            {
                w = false;
                foreach (Thread h in threads) // проверка, что есть живые потоки
                {
                    if (h.IsAlive == true)
                    {
                        w = true;
                    }
                }
            }while (w); // цикл для проверки статуса выполнения потоков сжатия
            stop = false;
        }