2013-06-14 1 views
1

은 분명히 모든 이클립스/SWT는 바쁜 마우스 표시를 관리하는 방법 그러나비동기 BusyIndicator를 제어

BusyIndicator.showWhile(Runnable synchronousStuffToDo) 

입니다했다, 나는 일어나지 않는다 "할 일"근본적으로 이벤트 중심의 프로젝트가 순차적 인 실행 라인 내에서 : 동작이 정렬되고 연속 콜백이 실행 관리자에 제공됩니다. 그러므로 나는실행 파일에 넣는 데 의미있는 것은 아무것도 없다.

저수준이지만 서두르지 만 또 다른 플랫폼이 있습니까? 플랫폼 독립적비지 인디케이터를 비동기 적으로 조작하는 방법은 두 개의 개별 메서드 호출 인 "활성화"와 "비활성화"를 의미합니까?

동일한 문제가 발생하여이 질문에 ProgressMonitorDialog을 추가해야합니다. 예, ProgressMonitorDialog#run 메서드 내에서 내부 이벤트 루프가 돌지 만, SWT 이벤트 루프는 내 실행 관리자 중 하나이므로 체인이 여전히 손상됩니다. 분명히이 클래스가 없으면 저수준 프리미티브에서 다시 구현하는 경우를 제외하고 진행 모니터를 표시 할 수 없습니다.

답변

5

클래스를 사용하여 Cursor을 조작 할 수있는 방법은 없습니다. 당신은 배경 Thread

public static void imBusy(final boolean busy){ 

    Display.getDefault().asyncExec(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      Shell shell = Display.getDefault().getActiveShell(); 
      if(busy){ //show Busy Cursor 
       Cursor cursor = Display.getDefault().getSystemCursor(SWT.CURSOR_WAIT);   
       shell.setCursor(cursor); 
      }else{ 
       shell.setCursor(null); 
      } 
     } 
    }); 

} 
+0

감사합니다. 그 동안 Busyindicator 클래스에서 코드를 복사했습니다. 비슷한 양이지만 모든 쉘에 커서를 설정합니다. –

0

에 작업을 실행하는 동안 바쁜 아이콘을 표시하는 방법 util을 아래 호출 할 수 있습니다 귀하의 작업 완료를 기다려야 실행 가능. 예 : (브라우저로 작성된 코드는 컴파일되지 않습니다 - 나는 예외를 무시하는거야)

final Object condition = new Object(); 
BusyIndicator.showWhile(new Runnable() { 
    public void run() { 
     synchronized(condition) { 
      while (!isMyTaskDoneFlag()) { 
       condition.wait(); 
      } 
     } 
    } 
}); 
doTask(new MyTask() { 
    public void perform() { 
     try { 
      // Task logic 
      ... 
     } finally { 
      // When done 
      setMyTaskDoneFlag(); 
      synchronized(condition) { 
       condition.notify(); 
      } 
     } 
    } 
}); 

이 작업의 모든 코드 경로가 실행 가능한 차단을 해제하는 것을 잊지 않도록합니다. 거의 동일한 접근법을 진행 모니터와 함께 사용할 수 있습니다 - 실행 모니터를 업데이트하기 위해 실행 가능을 깨울 수 있습니다.

참고 : 당신은 확인해야 할 SWT 스레드에서 실행되지 않습니다 실행 가능한 대기 (진척 모니터에서 실행되는 경우, 예를 들어이 truefork 설정) 또는 다른 응용 프로그램이 응답하지 않습니다.

+0

이것은 피하려고 열심히 노력하고있는 일종의 물건입니다 .-- 아무것도 기다리지 않고 기다리는 일을 낭비하고, 대가로 아무것도주지 않습니다. –

+0

BusyIndicator를 사용하지 않습니다. (알 수없는 기간 동안 UI를 잠글 필요가 있다면 무한 진행 모니터를 사용하십시오.이 방법으로 사용자는 실제로 이해하고 있습니다.) 이것이 가장 신뢰할 수있는 방법입니다. UI 애플리케이션 (예 : 본질적으로 단일 사용자)을 기다리는 추가 스레드가 실제로 상당한 리소스를 소비하고 있다고 생각하지 않습니다. – Eugene

+0

아직 실험 중입니다. 진행률 대화 상자로 갈 수도 있습니다. 차단 된 스레드에 대해서는 일반적인 원칙에 따라 거부합니다. 그동안 ProgressMonitorDialog 코드는 비동기 적으로 만 동일한 기능을 갖게되었습니다. –

0

나는 지금 일하고있는 구형 SWT 애플리케이션에서 해결책을 찾았다. (특히 좋아하지는 않지만 작동한다.)그것은 BusyIndicator#showWhile를 사용하며 내부 않는 동기 물건은 다음과 같습니다

    는 동시에 SWT 이벤트 루프를 회전하면서 마무리하기 위해 백그라운드 스레드를 기다리는 백그라운드 스레드
  1. 루프에서 비동기 작업을 시작
  2. 명시 적으로 :

    ,691 :
while (!taskDone){ 
    if (!display.readAndDispatch() && !shell.isDisposed()) { 
     display.sleep(); 
    } 
    taskDone = //check for task progress 
    //update something on the main window status bar 
} 

나는 청소기 (마르코 제안 무엇의 라인을 따라) 뭔가이 변환하려고 해요

  1. 배경 작업
  2. 설정 해제 바쁜 아이콘을 제출 바쁜 아이콘
  3. 을 설정

하지만 백그라운드 작업이 실제로 원격 호출 그래서입니다 (상태 표시 줄을 업데이트하기위한 가장 좋은 것입니다 모르겠어요 스레드는 끝날 때까지 차단됩니다.) 백그라운드 작업이 실행 중일 때이를 감지하고 이에 따라 상태 표시 줄을 업데이트하는 전용 스레드가 있다고 생각합니다 (업데이트는 점선으로 표시되며 아무 것도 특정 작업이 아닙니다). 그러나이 스레드는 단지 낭비로 보입니다. .

+0

방금이 기술에 매우 불쾌한 문제가 있다는 것을 깨달았습니다. 작업 t1이 시작된 후 두 번째 t2가 t1 완료 전에 시작되고 t1 완료가 t2까지 감지되지 않습니다. t1의 상태 검사가 t2에 대해 시작된 내부 검사 루프에 의해 일시 중지 되었기 때문에 완료됩니다. –

관련 문제