2009-08-01 4 views
0

TreeView을 가진 사용자 지정 사용자 정의 컨트롤이있는 프로그램 용 플러그인을 작성하고 있습니다. 사용자가 네이티브 프로그램에서 개체를 선택하거나 선택 취소하면 ObjectSelectedObjectDeselected 이벤트가 발생합니다. 이러한 이벤트가 발생하면 내 프로그램은 트리보기에서 해당 노드를 선택하거나 선택 취소합니다.일련의 마지막 일련의 이벤트가 발생했는지 어떻게 알 수 있습니까?

문제는 그래픽 3D 모델링 프로그램입니다. 따라서 사용자가 수천 개의 작은 객체에 걸쳐 선택 상자를 그리고 내 코드를 천 단위로 잘라내는 것이 매우 쉽습니다. ObjectSelected 이벤트. 그래서 지금은 플러그인이 작동하지만 사용자가 너무 많은 객체를 선택하면 거기에 앉아 있어야합니다. 내 플러그인이 모두 ObjectSelected 이벤트를 처리 할 때까지 기다려야합니다.

각 선택 이벤트에서 무언가를하는 대신 선택한 개체를 별도의 컬렉션에 캐시 한 다음 한 번에 하나씩 개체를 대량으로 처리 할 수 ​​있습니다. 그러나 마지막 ObjectSelected 이벤트가 발생했을 때 어떻게 알 수 있습니까?

각 개체 선택 이벤트가 타이머를 다시 설정할 수 있도록 여러 스레드를 사용해야한다고 생각합니다. 타이머가 마침내 종료 시간에 도달하면 선택한 객체의 전체 목록을 처리합니다.

비록 여러 스레드로 아무 것도하지 않았으므로 어디서부터 시작해야할지 몰라요. 또한 플러그인에 미리 정의 된 시간 제한을 사용하는 아이디어가 마음에 들지 않습니다. 사용자가 더 빠르거나 느린 컴퓨터에 있다면? 또는 그들이 선택한 객체 중 하나가 실제로 복잡하고 어떤 이유로 다른 객체를 선택하는 데 더 오래 걸리면 어떻게 될까요?

답변

0

여러 스레드로 작업하고 싶지 않다고 말했지만, 이는 정확한 상황입니다 (백그라운드 계산으로 별도의 스레드에 UI가있는 경우).

다행스럽게도 C#은 기본적인 스레딩을 매우 쉽게 만듭니다. BackgroundWorker 클래스와 그 중 일부 예제를 살펴보십시오.

BackgroundWorker를 취소하고 새로운 계산으로 다시 시작할 수있는 기능을 추가하여 다른 항목을 빠르게 선택하여 문제를 해결할 수 있습니다.

관련 문제