2012-12-14 4 views
1

직렬 포트에서 데이터를 수신 한 다음 처리하여 listview에 표시하는 C# Winforms 응용 프로그램이 있습니다.밀리 초 단위로 데이터를 수신하면 Winforms 응용 프로그램이 응답하지 않습니다.

100ms에서 데이터를받는 것이 좋지만 소스 전송률을 10 밀리 초로 변경하면 1 분 또는 2 분 후에 응용 프로그램이 중단됩니다.

세부 사항 :

응용 바이트의 데이터를 수신, 그래서리스트 뷰 컬럼에 ArrayList를에서 문자열, 저장, 변환하고 그것을 채우기 위해, 몇 가지 변환이 작업에 참여해야합니다

  1. 바이트를 문자열로 변환
  2. 정수로 변환하는 문자열이 거의 없습니다.

나는 또한 다음과 같습니다 일반 목록보기 코드를 사용하고 있습니다 :

ListViewItem item = new ListViewItem(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")); 
item.SubItems.Add(hex1.ToString()); 
item.SubItems.Add(hex2.ToString()); 

..... 

listView1.Items.Add(item); 

그래서 내가 잘못 뭐죠 모르겠습니다. listview은 데이터가 전송되는 속도를 처리 할 수 ​​없습니까?

응용 프로그램이 그 속도로 정지하는 이유는 무엇입니까?

답변

2

각 항목을 삽입 한 후에도 목록보기 자체가 다시 그려지기를 기대합니다. 삽입 사이 간격보다 다시 그리는 데 시간이 오래 걸리면 끊기게됩니다. 물론, 목록이 길어지면 더 악화됩니다.

일괄 업데이트를 누적하고 일괄 처리를 삽입하기 전에 ListView.BeginUpdate()를 호출하고 일괄 처리를 삽입 한 후 ListView.EndUpdate()를 호출하여 수정할 수 있습니다.

+0

'ListView.BeginUpdate()'및'ListView.EndUpdate()'가 작동하지 않는 것 같습니다. 아무런 업데이트가 없으면 listview는 아무 것도 표시하지 않습니다. – Liban

3

Thread, Task 또는 BackgroundWorker으로 직렬 데이터 수신기를 실행해야합니다. 거기에서 당신은 당신의 ListView를 직접 기입하지 않습니다. 대신 VirtualMode을 사용하도록 구성해야합니다. VirtualMode을 사용하는 방법의 예는 at MSDN입니다.

+0

ohw .. 이것은 좋은 아이디어와 복잡함도 있습니다. 내가 고마워. – Liban

관련 문제