2012-03-08 3 views
0

내 프로그램에는지도 편집기가 있습니다. 데이터베이스에서 정보를로드 한 후지도에 따라 사용자 지정 컨트롤 (6000-10000)을 생성해야합니다. 불행히도 사용자의 화면을 10-20 초 동안 잠급니다.UI 집중 응용 프로그램

지연로드를 사용하여 어떻게 할 수 있습니까? 충돌 및 잠금 화면없이 어떻게 할 수 있습니까?

답변

2

이 질문은 광범위합니다. 그러나 나는 당신에게 많은 힌트를 줄 수있다. 우선, 저는 많은 사용자 정의 컨트롤이 필요 없다고 확신합니다. 사용자가 가지고있는 입력 장치의 수를 생각해 보면, 그는 많은 컨트롤과 상호 작용할 수 없다. 동시에. 따라서 이러한 컨트롤에 대해 여러 가지 방법으로 "속일 수 있습니다". 예를 들어, 컨트롤의 이미지를 표시하고 사용자가 상호 작용을 시작하면 전환 할 수 있습니다. 또 다른 것은 보이지 않는 것을 필요로하지 않는다는 것입니다. 10 개만 화면에 맞을 경우 왜 10000 개의 요소 목록을 만드나요? 이유를 없애는 방법이있는 이유는 없습니다. 하나는 Virtualization이며 여러 가지 방법으로 수행 할 수 있습니다. ui 구성 요소의 로딩을 지연하거나 데이터 가상화를 사용하여 UI 가상화를 사용할 수 있습니다. 또 다른 것은 데이터 가상화와 협력하여 스레드 또는 백그라운드 작업자를 사용하여 많은 양의 데이터로드를 처리하는 것입니다. 일괄 적으로 데이터를 생성하여 UI 스레드가 Windows 메시지를 처리 ​​할 시간을줍니다.

+0

이러한 컨트롤의 대부분은 이미지가 있고 모두 캔버스 안에 있습니다. 불행히도 전체지도를 볼 수있는 화면에 표시된, 하지만 당신이 말했듯이, 아마도 그가 사용하지 않은 다른 정보를 제거하거나 어떤 형태의 가상화를 시도 할 수는 있습니다. –

+0

사용자에게 일정한 양의 픽셀 만 표시 할 수 있습니다. 사용자에게 데이터를 표시 할 때 가짜와 속임수를 항상 지정할 수 있습니다. 예를 들어 googlemaps를 살펴보면 거대한 이미지가 하나도 없으며 영리하게 리로드하고 캐시합니다. 그런 것들도 당신을위한 방법일지도 모릅니다. – dowhilefor

+0

내 응용 프로그램에서 큰 문제를 발견했습니다.재귀 적으로 다른 캔버스 안에 캔버스를 캡슐화합니다. 정말 무겁습니다. 저는 작업을 변경하고 있습니다. –

1

바인딩을 살펴 보거나 백그라운드 스레드에서 작업 하시겠습니까? ListView에있는 경우 VirtualMode를 살펴보십시오. http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

이 컨트롤을로드하는 대상은 무엇입니까? UI 스레드에서이 작업을 수행하고 있습니까?

+0

대부분의 컨트롤에는 이미지가 있으며 캔버스에 모두 포함되어 있지만 불행히도이 솔루션을 사용할 수 없습니다. –

0

사용 TPL (작업 병렬 라이브러리) 별도의 스레드에서 DB 작업을 수행하는 ... 그것은 다음과 같습니다

Task.Factory.StartNew(() => MyLongRunningMethod)); 

확인 자세한 내용은 CodeProject의에 밖으로 this 좋은 기사 이상 ...

편집 : 아래에 언급했듯이 원래의 대답은 어떻게 든 컨트롤은 별도의 스레드에서 생성 될 수 있지만 실제로는 시각적 트리의 일부로 UI가 생성되므로 UI ​​스레드에서 컨트롤을 생성해야합니다. 유효한 제안 ...

편집 : signle 화면에 10000 개의 맞춤 컨트롤을 설치하는 방법을 알 수 없으므로 보이는 컨트롤 만 생성되고 나머지 컨트롤은 얻을 수있는 일부 유형의 가상화 스키마를 사용하는 방법이 있어야합니다 수요에 따라 생성 ...

+0

이것은 훌륭한 해결책 인 것처럼 보입니다. 공유 해 주셔서 감사합니다. –

+0

np, 도와 드리겠습니다. –

+0

불행히도 시각적 구성 요소를 만들고 관리하는 작업을 사용하는 방법을 찾지 못했습니다 ... –

관련 문제