Пропадают события
От: ZeeM  
Дата: 30.11.07 13:41
Оценка:
Есть класс который обрабатывает события от com-порта. Полученная информация передается с помощью событий в главную форму для дальнейшей обработки и еще в одну форму где отображается log информация о работе с портом.

В log форме вывожу полученную информацию потоко-безопасно для WinForm(вывожу в ListView):


        ....
        
        public void Invoke(MethodInvoker methodToInvoke)
        {
            if (InvokeRequired)
            {
                base.Invoke(methodToInvoke);
            }
            else
            {
                methodToInvoke();
            }
        }

        private void SetListView_Log(string sItem1,
                                        string sItem2,
                                        string sItem3,
                                        string sItem4,
                                        string sItem5)
        {
            Invoke(delegate
           {
               ListViewItem LVI = new ListViewItem(sItem1);
               LVI.SubItems.Add(sItem2);
               LVI.SubItems.Add(sItem3);
               LVI.SubItems.Add(sItem4);
               LVI.SubItems.Add(sItem5);
               LVI.SubItems.Add(DateTime.Now.ToString());
               ListView_Log.Items.Add(LVI);

               if (ListView_Log.Items.Count > 1000)
                   RemoveItem(ListView_Log.Items.Count - 1);
           }
            );
        }


В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?
Re: Пропадают события
От: Codechanger Россия  
Дата: 30.11.07 13:48
Оценка:
Здравствуйте, 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);

ZM>               if (ListView_Log.Items.Count > 1000)
ZM>                   RemoveItem(ListView_Log.Items.Count - 1);
ZM>           }
ZM>            );
ZM>        }
ZM>


ZM>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?


Попробуйте рефрешить лист после апдейта. Да и добавлять лучше с BeginEdit,EndEdit, если меня память не подводит...
Re: Пропадают события
От: vitz  
Дата: 30.11.07 14:23
Оценка:
Здравствуйте, 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>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?
Re[2]: Пропадают события
От: ZeeM  
Дата: 30.11.07 15:15
Оценка:
Здравствуйте, 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...
Re: Пропадают события
От: meerius Канада  
Дата: 30.11.07 15:41
Оценка:
Здравствуйте, 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);

ZM>               if (ListView_Log.Items.Count > 1000)
ZM>                   RemoveItem(ListView_Log.Items.Count - 1);
ZM>           }
ZM>            );
ZM>        }
ZM>


ZM>В результате часть событий не отображаются в форме. Т.е. просто пропадают. Часть приходит с опозданием. В чем может быть проблема?


Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных.
Передите на асинхронные вызовы
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[2]: Пропадают события
От: ZeeM  
Дата: 03.12.07 11:53
Оценка:
Здравствуйте, meerius, Вы писали:

M>Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных.

M>Передите на асинхронные вызовы

Inoke подразумевает собой асинхронную работу. Данные не теряются, просто часть событий не доходит до WinForm.
Re[3]: Пропадают события
От: meerius Канада  
Дата: 03.12.07 23:26
Оценка:
Здравствуйте, ZeeM, Вы писали:

ZM>Здравствуйте, meerius, Вы писали:


M>>Вы же их синхронно обрабатываете, тем самым оставляя прослушивание канала на длительное время, что приводит к потерям данных.

M>>Передите на асинхронные вызовы

ZM>Inoke подразумевает собой асинхронную работу. Данные не теряются, просто часть событий не доходит до WinForm.


Вы ошибаетесть, Ivnoke- это синхронный метод, если хотите работать асинхронно, вызывайте BeginInvoke.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.