Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.
В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):
Здравствуйте, ZeeM, Вы писали:
ZM>Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.
ZM>В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):
Здравствуйте, ZeeM, Вы писали:
ZM>Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.
ZM>В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):
ZM>
ZM> ....
ZM> public void Invoke(MethodInvoker methodToInvoke)
ZM> {
ZM> if (InvokeRequired)
ZM> {
ZM> base.Invoke(methodToInvoke);
ZM> }
ZM> else
ZM> {
ZM> methodToInvoke();
ZM> }
ZM> }
ZM> private void SetListView_Log(string sItem1,
ZM> string sItem2,
ZM> string sItem3,
ZM> string sItem4,
ZM> string sItem5)
ZM> {
ZM> Invoke(delegate
ZM> {
ZM> ListViewItem LVI = new ListViewItem(sItem1);
ZM> LVI.SubItems.Add(sItem2);
ZM> LVI.SubItems.Add(sItem3);
ZM> LVI.SubItems.Add(sItem4);
ZM> LVI.SubItems.Add(sItem5);
ZM> LVI.SubItems.Add(DateTime.Now.ToString());
ZM> ListView_Log.Items.Add(LVI);
// может ListView_Log.Items.Insert(0,LVI)
// ибо Add добовляет в конец а ниже вы все это дело ... хотя код RemoveItem не известен
ZM> if (ListView_Log.Items.Count > 1000)
ZM> RemoveItem(ListView_Log.Items.Count - 1);
ZM> }
ZM> );
ZM> }
ZM>
ZM>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?
Здравствуйте, vitz, Вы писали:
V>Здравствуйте, ZeeM, Вы писали:
ZM>>Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.
ZM>>В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):
ZM>>
ZM>> ....
ZM>> public void Invoke(MethodInvoker methodToInvoke)
ZM>> {
ZM>> if (InvokeRequired)
ZM>> {
ZM>> base.Invoke(methodToInvoke);
ZM>> }
ZM>> else
ZM>> {
ZM>> methodToInvoke();
ZM>> }
ZM>> }
ZM>> private void SetListView_Log(string sItem1,
ZM>> string sItem2,
ZM>> string sItem3,
ZM>> string sItem4,
ZM>> string sItem5)
ZM>> {
ZM>> Invoke(delegate
ZM>> {
ZM>> ListViewItem LVI = new ListViewItem(sItem1);
ZM>> LVI.SubItems.Add(sItem2);
ZM>> LVI.SubItems.Add(sItem3);
ZM>> LVI.SubItems.Add(sItem4);
ZM>> LVI.SubItems.Add(sItem5);
ZM>> LVI.SubItems.Add(DateTime.Now.ToString());
ZM>> ListView_Log.Items.Add(LVI);
V>// может ListView_Log.Items.Insert(0,LVI)
V>// ибо Add добовляет в конец а ниже вы все это дело ... хотя код RemoveItem не известен
V>
ZM>> if (ListView_Log.Items.Count > 1000)
ZM>> RemoveItem(ListView_Log.Items.Count - 1);
ZM>> }
ZM>> );
ZM>> }
ZM>>
ZM>>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?
У ListView — ListView_Log.Sorting = SortOrder.Descending;
Я думаю, что теряются из-за Invoke...
Здравствуйте, ZeeM, Вы писали:
ZM>Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.
ZM>В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):
ZM>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?
Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных.
Передите на асинхронные вызовы
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Здравствуйте, meerius, Вы писали:
M>Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных. M>Передите на асинхронные вызовы
Inoke подразумевает собой асинхронную работу. Данные не теряются, просто часть событий не доходит до WinForm.
Здравствуйте, ZeeM, Вы писали:
ZM>Здравствуйте, meerius, Вы писали:
M>>Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных. M>>Передите на асинхронные вызовы
ZM>Inoke подразумевает собой асинхронную работу. Данные не теряются, просто часть событий не доходит до WinForm.
Вы ошибаетесть, Ivnoke- это синхронный метод, если хотите работать асинхронно, вызывайте BeginInvoke.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»