/// <summary> /// Выполняет делегат ReadDelegate /// </summary> /// <param name="o"> /// массив object[2]; o[0] - выполняемый делегат, o[1] - массив object[3], содержащий параметры делегата /// </param> private void ExecReadDelegate(object o) { ProceedingCompleetedDelegate rd = (ProceedingProgressChangedDelegate)((object[])o)[0]; object[] prm = (ProceedingProgressChangedDelegate)((object[])o)[1]; rd((string)prm[0], (byte[])prm[1]); }
/// <summary> /// Выполняет делегат ProceedingCompleetedDelegate /// </summary> /// <param name="Params"> /// массив object[4]; o[0] - выполняемый делегат, o[1] - Sender, o[2] - Data, o[3] - Error /// </param> private void ExecProceedingCompleetedDelegate(object Params) { object[] prm = (object[])Params; try { ProceedingCompleetedDelegate pcd = (ProceedingCompleetedDelegate)prm[0]; pcd(prm[1], (byte[])prm[2], (bool)prm[3]); } catch { //Я не знаю почему здесь вылетает исключение "доступ к ликвидированному объекту не возможен" } }
private Guid AddElement ( string Marker, DebuggerPrimitive.ActionType Queuetype, MemoryType Memorytype, int Address, byte[] Recording_Buffe, int Count, bool CycleElement, int Period, ProceedingCompleetedDelegate Callback, ProceedingProgressChangedDelegate PartCallback) { Guid m_ret = Guid.NewGuid(); Trace.WriteLine("Добавление запроса в очередь :" + m_ret.ToString(), "DebuggerEngine"); DebuggerPrimitive.QueueElement m_newQuery = new DebuggerPrimitive.QueueElement(); if (Count > BufferSize) { //Добавляем часть для чтения частями m_newQuery.isReadLongBuffer = true; m_newQuery.ReadLongBuffer = new DebuggerPrimitive.ReadLongData(Count); m_newQuery.iAddress = Address; m_newQuery.PartCallBack = PartCallback; } else { m_newQuery.isReadLongBuffer = false; m_newQuery.ReadLongBuffer = null; } m_newQuery.Marker = Marker; m_newQuery.Period = Period; m_newQuery.ID = m_ret; m_newQuery.Address = Address; m_newQuery.Callback = Callback; m_newQuery.Count = Count; m_newQuery.CycleElement = CycleElement; m_newQuery.Memorytype = Memorytype; m_newQuery.Queuetype = Queuetype; m_newQuery.Recording_Buffer = Recording_Buffe; //Блокируем список и добавляем элемент lock (_AddElementInQueue) { _AddElementInQueue.Add(m_newQuery); } return(m_ret); }
/// <summary> /// Добавление элемента в очередь /// </summary> /// <param name="Queuetype">Тип запроса (чтение/запись)</param> /// <param name="Memorytype">Тип памяти</param> /// <param name="Address">Начальный адрес</param> /// <param name="Count">Количество байт для чтения</param> /// <param name="Period">Период опроса</param> /// <param name="CycleElement">Флаг цикличности</param> /// <param name="Recording_Buffe">Записываемых буфер</param> /// <param name="Callback">Функция обратного вызова</param> /// <returns>Уникальный номер в очереди</returns> public Guid AddElementInQueue ( DebuggerPrimitive.ActionType Queuetype, MemoryType Memorytype, int Address, byte[] Recording_Buffe, int Count, bool CycleElement, int Period, ProceedingCompleetedDelegate Callback ) { Guid m_ret = AddElement(null, Queuetype, Memorytype, Address, Recording_Buffe, Count, CycleElement, Period, Callback, null); return(m_ret); }
/// <summary> /// Добавляет в очередь опороса отладчика объект записи данных /// </summary> /// <param name="Address">Адрес области памяти, к которой производится обращение</param> /// <param name="MemoryType">Тип области памяти, которой производится обращение</param> /// <param name="Count">Число байт, которое надо считать</param> /// <param name="Sender">Опрашиваемый объект</param> /// <param name="ProgressChangedCallback">Callback для получения информации о процессе опроса</param> /// <param name="CompleetingCallback">Callback для порлучения информации о завершении опроса</param> public void AddWriteItem(int Address, MemoryType MemoryType, byte[] Buffer, object Sender, ProceedingProgressChangedDelegate ProgressChangedCallback, ProceedingCompleetedDelegate CompleetingCallback) { lock (this.writeItems) { this.writeItems.Add(new RequestItem() { Address = Address, MemoryType = MemoryType, Data = Buffer, Sender = Sender, ProgressChangedCallback = ProgressChangedCallback, ProceedingCompletedCallback = CompleetingCallback }); } }
/// <summary> /// Добавляет в очередь опороса отладчика элемент чтения данных данных /// </summary> /// <param name="Address">Адрес области памяти, к которой производится обращение</param> /// <param name="MemoryType">Тип области памяти, которой производится обращение</param> /// <param name="Buffer">Записываемые даные</param> /// <param name="Sender">Опрашиваемый объект</param> /// <param name="ProgressChangedCallback">Callback для получения информации о процессе опроса</param> /// <param name="CompleetingCallback">Callback для порлучения информации о завершении опроса</param> public void AddReadItem(int Address, MemoryType MemoryType, int Count, object Sender, ProceedingProgressChangedDelegate ProgressChangedCallback, ProceedingCompleetedDelegate CompleetingCallback) { RequestItem item = new RequestItem() { Address = Address, Data = new byte[Count], MemoryType = MemoryType, RequestType = RequestType.Read, Sender = Sender, ProgressChangedCallback = ProgressChangedCallback, ProceedingCompletedCallback = CompleetingCallback }; this.lockingMemoryType = MemoryType; this.lockingAddress = Address; this.lockingLength = Count; this.lockingActive = true; this.AddReadItem(item); this.lockingActive = false; }