2013-01-08 2 views
1

저는 JTabbedpane이있는 패널을 가지고 있고 모든 탭에서 쿼리를 실행하기위한 매개 변수를 설정할 수 있습니다. 하나의 쿼리가 데이터베이스에서 자신의 데이터를 검색하는 중 바쁠 때 이미 새 탭을 열어 새 매개 변수를 설정할 수 있습니다. 데이터베이스에 대한 과부하를 피하려면 한 번에 하나의 쿼리 만 실행하면됩니다. 그러나 실행을 클릭하면 프로그램이 올바른 순서로 실행할 쿼리를 기억해야합니다. 실행 중에는 실행 중지를 위해 클릭 할 수있는 중지 버튼이 있기 때문에 로더 아이콘이 표시되고 GUI가 고정되지 않을 수 있습니다.
스윙 워커 (swingworker)를 사용하여 쿼리를 실행하는 동안 GUI가 차단되는 것을 막았습니다. 하지만 이제 이전 쿼리가 끝나기 전에 다음 쿼리가 시작되지 않도록하고 싶습니다.스윙 워커를 세마포어로 순차적으로 실행하십시오.

private void doStoredQuery() { 
     try { 
      semaphore.acquire(); 
      System.out.println(queryName + "started"); 
      worker.execute(); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
(내가 추가 한에 println이 시작되는 참조 명령을 중지 또는 종료)이이 SwingWorker의 시작 코드가 private final Semaphore semaphore = new Semaphore(1, true);

: 모델에서, 전체 패널에 대한 일반적인, 나는 세마포어를 초기화

그리고 이것은 (initializeWorker()가 메인 클래스의 생성자에서 호출) 내 SwingWorker의이다 : 나는 취득을 넣고 코드의 다른 위치에 출시하려고했습니다

private SwingWorker<StoredQueryDataModel, Integer> initializeWorker() { 
    worker = new SwingWorker<StoredQueryDataModel, Integer>() { 
     @Override 
     protected StoredQueryDataModel doInBackground() throws Exception { 
      try { 
       StoredQueryDataModel dataModel = null; 
       publish(0); 
       try { 
        dataModel = new StoredQueryDataModel(queryRunner, ldbName, queryName, params); 
       } catch (S9SQLException e) { 
        // 
       } catch (Throwable e) { 
        showErrorMessage(e); 
       } 
       return dataModel; 
      } 
      finally { 
       semaphore.release(); 
       System.out.println(queryName + "finished"); 
      } 
     } 

     @Override 
     protected void process(List<Integer> chunks) { 
      //ignore chunks, just reload loader icon 
      panel.repaint(); 
     } 

     @Override 
     protected void done() { 
      String error; 
      try { 
       result = get(); 
       error = null; 
      } catch (Exception e) { 
       error = e.getMessage(); 
      } 

      if(result == null) { 
       semaphore.release(); 
       System.out.println(queryName + " stopped"); 
      } 

      if(error == null) { 
       // process result 
      } 
      else { 
       showErrorMessage(new Throwable(error)); 
      } 
     } 

    }; 
    return worker; 
} 

,하지만 아무것도가 보인다 작업. 나는 Swingworker와 sempahores에서 아주 새로운 ... 누군가 도울 수 있습니까?

답변

0

나는 문제를 발견했다 : 세마포어는 정적 변수 여야 만했다. 내 코드에는 탭이있는만큼 많은 세마포가 있었기 때문에 연속적으로 실행되는 대신에 동일한 시간에 실행되었습니다.