// запись списка техпроцессов в разделяемую память
        private void WriteIntoMappedMemory()
        {
            DataGridViewSelectedRowCollection Collection = dataGridViewListOfDetails.SelectedRows;

            TechList list = new TechList();

            for (int i = Collection.Count - 1; i >= 0; i--)      // в коллекции строки находятся в обратном порядке
            {
                DataGridViewRow row   = Collection[i];
                int             index = (int)dataGridViewListOfDetails["Number", row.Index].Value;
                list.Add(Globals.dictQwewe[index]);
            }
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xmlSer = new XmlSerializer(typeof(TechList));
                xmlSer.Serialize(ms, list);
                ms.Position = 0;
                byte[] byteArray = ms.ToArray();
                int    size      = byteArray.Length;
                if (size >= 1000000)
                {
                    MessageBox.Show("Слишком большой объём передаваемых данных!");
                    return;
                }
                //Создание участка разделяемой памяти. Первый параметр - название участка, второй - длина участка памяти в байтах: тип byte занимает 1 байт плюс четыре байта для одного объекта типа Integer (для передачи длины сообщения)
                using (MemoryMappedViewAccessor writer = Globals.sharedMemory.CreateViewAccessor(0, size + 4)) //Создаем объект для записи в разделяемый участок памяти
                {
                    writer.Write(0, size);                                                                     // сначала записываем в разделяемую память, начиная с нулевой позиции, размер сообщения
                    writer.WriteArray <byte>(4, byteArray, 0, size);                                           //записываем в разделяемую память, начиная с четвёртой позиции, сообщение
                    writer.Flush();
                }
            }
        }
        // вставка техпроцессов из разделяемой памяти в системный грид
        private void ToolStripMenuItemPasteFromMappedMemory_Click(object sender, EventArgs e)
        {
            int size;   // размер передаваемого сообщения

            byte[] byteArray;
            // считываем размер сообщения
            using (MemoryMappedViewAccessor reader = Globals.sharedMemory.CreateViewAccessor(0, 4, MemoryMappedFileAccess.Read))
            {
                size = reader.ReadInt32(0);
                reader.Dispose();
            }
            // считываем сообщение
            using (MemoryMappedViewAccessor reader = Globals.sharedMemory.CreateViewAccessor(4, size, MemoryMappedFileAccess.Read))
            {
                byteArray = new byte[size];
                reader.ReadArray <byte>(0, byteArray, 0, size);
                reader.Dispose();
            }
            XmlSerializer xmlSer = new XmlSerializer(typeof(TechList));
            MemoryStream  stream = new MemoryStream(byteArray);
            TechList      Tlist  = (TechList)(xmlSer.Deserialize(stream));

            foreach (Technology tech in Tlist.list)
            {
                Globals.AddTechnology(tech);
            }
        }
Beispiel #3
0
        /* static void Main()
         * {
         *   Application.EnableVisualStyles();
         *   Application.SetCompatibleTextRenderingDefault(false);
         *   Application.Run(new Form1());
         * }*/

        static void Main(string[] str)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Globals.sharedMemory = MemoryMappedFile.CreateOrOpen("Bufer", 1000000);
            if (str.Length != 0 && str[0] == "TRUE") // если в параметрах было что-то передано - значит в разделяемой памяти находятся техпроцессы
            {
                int    size;                         // размер передаваемого сообщения
                byte[] byteArray;
                // считываем размер сообщения
                using (MemoryMappedViewAccessor reader = Globals.sharedMemory.CreateViewAccessor(0, 4))
                {
                    size = reader.ReadInt32(0);
                    reader.Dispose();
                }
                // считываем сообщение
                using (MemoryMappedViewAccessor reader = Globals.sharedMemory.CreateViewAccessor(4, size))
                {
                    byteArray = new byte[size];
                    reader.ReadArray <byte>(0, byteArray, 0, size);
                    reader.Dispose();
                }
                XmlSerializer xmlSer = new XmlSerializer(typeof(TechList));
                MemoryStream  stream = new MemoryStream(byteArray);
                TechList      Tlist  = (TechList)(xmlSer.Deserialize(stream));
                Application.Run(new Form1(Tlist));
                return;
            }
            Application.Run(new Form1());
        }
 public Form1(TechList Tlist)
 {
     Constructor();
     foreach (Technology tech in Tlist.list)
     {
         Globals.AddTechnology(tech);
     }
 }