// запись списка техпроцессов в разделяемую память 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); } }
/* 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); } }