2010-06-23 2 views
2

내 마지막 해의 프로젝트의 일환으로 필자는 그러한 것이 존재한다면 "그래픽 IDE"카테고리에 맞는 데스크탑 응용 프로그램을 개발했습니다. Jessy James Garrett Visual Vocabulary for Information Architecture and Interaction Design의 작은 하위 집합을 구현 했으므로 사용자는 웹 응용 프로그램에서 사용자의 경험을 나타내는 다이어그램 (즉, 유향 그래프)을 그릴 수 있고 HTML 템플릿을 페이지에 할당하고 커넥터/전환에 일부 코드를 쓸 수 있습니다 응용 프로그램이 컴파일되고 사용자가 해당 하이퍼 링크를 클릭하면 실행됩니다.이 SwingWorker가 ThreadPoolExecutor의 스레드를 재사용하지 않습니까?

(두 개 이상의 하이퍼 링크를 게시 할 수 없습니다,하지만 난 JJG의 비주얼 어휘에 설명 된 사용자 경험의 요소를 페이지와 커넥터를 말하는 겁니다) 그래서 생성하는 다른 SwingWorkers의를 사용하고

다이어그램이 번역되는 C++ 소스 파일 세트. 로그를 보면 앱이 항상 재사용되는 대신 새로운 스레드를 생성한다는 것을 알 수 있습니다.

15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Building source code for transition: connector_29 
15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Project retrieved: sasdasdasd 
15:29:55.750 [SwingWorker-pool-2-thread-26] INFO i.v.a.webapp.htcpp.CTransition - Generated C:\Workspaces\PFC\aedifico-ui\sasdasdasd\connector_29_action.h... 
15:29:55.750 [SwingWorker-pool-2-thread-26] INFO i.v.a.webapp.htcpp.CTransition - Generated C:\Workspaces\PFC\aedifico-ui\sasdasdasd\connector_29_action.cpp... 
15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Transition generated at: C:\Workspaces\PFC\aedifico-ui\sasdasdasd/connector_29_action.cpp 

내 모든 근로자는 같은 두 가지 작업을 수행합니다

  1. 는 C 프리 마커 템플릿 엔진을 사용하여 ++ 소스와 헤더 파일 한 쌍을 생성합니다.

  2. 상황이 가는 방법을 사용자에게 알려 에 게시 프로세스 메커니즘을 통해 EDT에 메시지를 보냅니다.

나는 신중하게 SwingWorker을 코딩했다고 생각합니다. 특히 FileWriter 인스턴스가 예상대로 닫히지 않을까 걱정했지만 ThreadPoolExecutor이 이전에 만든 스레드를 다시 사용하지 않는 이유를 알 수 없습니다.

마법은 ConnectorGenerator에서 발생합니다. BaseWorkerSwingWorker<V,T>으로 확장되어 사용자에게 메시지를 표시하기 위해 구성 요소와 통신하는 동작 만 보유합니다. 못생긴 것과 같이 지옥 시도 - 캐치 finally 블록을 포함

public class ConnectorGenerator<Void> extends BaseWorker<Void> { 
    @Override 
    public Void doInBackground() { 
     Transition transition = connector.getModel().getTransition(); 
     logger.debug("Building source code for transition: {}", transition.getName());  
     logger.debug("Project retrieved: {}", project.getName()); 
     try { 
      publish("Generating transition (%s) source code at %s", transition.getName(), project.getBaseDir()); 
      /** 
      * Transition.build(String), attached below, is responsible of generating and writing the files 
      */ 
      transition.build(project.getBaseDir().getPath()); 
      publish("Transition generated."); 
     } catch (BuilderException e) { 
      logger.error("Error: {}", e); 
      publish("There was an error that prevented generating %s's source code", transition.getName()); 
     } 
     logger.debug("Transition generated at: {}/{}", project.getBaseDir(), transition.getSource()); 

     return null; 
    } 
} 

그리고 Transition.build(String)에있어서,

@Override 
public void build(String path) throws BuilderException {    
    generateFile(String.format("%s%s%s", path, File.separator, getHeader()), "action.h.ftl"); 
    generateFile(String.format("%s%s%s", path, File.separator, getSource()), "action.cpp.ftl");  
} 

private void generateFile(String path, String templateName) throws BuilderException { 
    FileWriter out = null; 
    try { 
     Map<String, Object> model = new HashMap<String, Object>(); 
     model.put("transition", this); 
     Configuration config = new Configuration(); 
     config.setClassForTemplateLoading(CTransition.class, "/"); 
     config.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER); 

     out = new FileWriter(path); 
     freemarker.template.Template template = config.getTemplate(templateName); 
     template.process(model, out, ObjectWrapper.BEANS_WRAPPER); 
     stdout.info("Generated {}...", path);   
    } catch (IOException e) { 
     throw new BuilderException(e); 
    } catch (TemplateException e) { 
     throw new BuilderException(e); 
} finally { 
     if (out != null) 
      try { 
       out.flush(); 
       out.close(); 
      } catch (IOException e) { 
       throw new BuilderException(e); 
      } 
}  
} 

사람이 보거나 아마 누락 뭔가를 알고 있나요?

+0

당신이있는 ThreadPoolExecutor를 호출 코드에 표시되지 않습니다. –

+0

@Romain, 작업자의 실행을 예약 할 때 호출됩니다. ConnectorGenerator worker = new ConnectorGenerator(); worker.execute(); –

+0

나는 언급하지 않았다. SwingWorkers는 ThreadPoolExecutor를 10 개의 스레드와 함께 사용하고, 10 개가 실행중인 경우 더 많은 스레드를 생성한다. –

답변

1

은 어쩌면 당신을위한 흥미로운 : SwingWorker deadlocks due one thread in the swingworker-pool

+0

나는 내 자신의 ThreadPoolExecutor로 임시 수정을 할 것이고, 나는 이것이 정말로 일어나고 있다고 생각할 수 없다. :-) –

+0

예, 업데이트 20에서이 문제를 해결하지 못했지만 정말 귀찮습니다. – keuleJ

관련 문제