Пример #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 WriteToFile()
        {
            while (ProgramManager.stop)
            {
                Monitor.Enter(ProgramManager.lock2);
                Monitor.Enter(ProgramManager.lock3); // блокирую List
                Monitor.Exit(ProgramManager.lock2);

                foreach (object _objW in ProgramManager.list)
                {
                    ObjForWriter objW = (ObjForWriter)_objW;
                    Console.WriteLine("{0}+{1}", objW.readNumber, writeNumber);

                    if (objW.readNumber == writeNumber)
                    {
                        writeStream.Write(objW.array, 0, objW.memoryPosition);
                        objW.readNumber = -1;
                        writeNumber++;
                    }
                }
                for (int i = 0; i < ProgramManager.list.Count; i += 0) // удаляю объекты, части которых были записаны
                {
                    ObjForWriter objW2 = (ObjForWriter)ProgramManager.list[i];
                    if (objW2.readNumber == -1)
                    {
                        ProgramManager.list.Remove(objW2);
                    }
                    else
                    {
                        i++;
                    }
                }
                Monitor.Exit(ProgramManager.lock3);
            }
            Console.WriteLine("Close");
            writeStream.Close();
        }