2012-08-28 5 views
2

Bonjour, J'ai implémenté IProgressMonitor et SubProgressMonitor de "org.eclipse.core.runtime". Le moniteur de progression fonctionne mais mon problème est qu'il ne montre pas les progrès comme je le voulais. Il ne montre aucun progrès avant qu'il ne soit fait. Je vais vous donner l'exemple de code.Java: affiche la progression d'un moniteur de progression et d'un moniteur de progression secondaire

try { 
      PlatformUI.getWorkbench().getProgressService(). 
      busyCursorWhile(new IRunnableWithProgress() { 

       @Override 
       public void run(IProgressMonitor monitor) throws InvocationTargetException, 
         InterruptedException { 
        // TODO Auto-generated method stub 
        try{ 

         monitor.beginTask("Operation in Progress...", ticks); 

         for(int i = 0; i < getCompilationUnit().size(); i++){ 

          try { 
           IType type = getCompilationUnit().get(i).findPrimaryType(); 

           IType[] types = getCompilationUnit().get(i).getTypes(); 

           if(monitor.isCanceled()) 
            throw new OperationCanceledException(); 

           updateListPrimaryType(type, totalNumberOfCode, types); 
           monitor.worked(1/ticks); 

           IMethod[] method = type.getMethods(); 
           int work = method.length; 
           updateListIMethod(method); 
           monitor.worked(1/ticks); 

           updateListMethodAttributeMember(type,new SubProgressMonitor(monitor, (1/ticks)));   
           updateListMember(type,types); 
           monitor.worked(1/ticks); 

          } catch (JavaModelException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         } 

        }finally{ 
         monitor.done(); 
        } 
       } 
      }); 

Ceci est le code de la méthode updateListMethodAttributeMember:

private void updateListMethodAttributeMember(IType type,SubProgressMonitor subProgressMonitor) { 
    // TODO Auto-generated method stub  
    ClassList tmp; 
    try{ 

     IMethod[] method = type.getMethods(); 
     IField[] field = type.getFields(); 

     subProgressMonitor.beginTask("Operation in Progress...", method.length); 
     for(int m = 0; m < method.length; m++){ 
      String methodName = getSubstringName(method[m].toString()); 

      IMethod met = method[m]; 
      tmp = new ClassList(className, methodName, path); 

      if(!met.isConstructor() || !met.isMainMethod()){ 
       try { 
        int number = performIMethodSearch(met); 
        tmp.setNumberOfCalls(number); 
       } catch (CoreException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      subProgressMonitor.worked(1/method.length); 
      getMethodClassList().add(tmp); 
     } 

     for(int f = 0; f < field.length; f++){ 
      String attributeName = getSubstringName(field[f].toString()); 
      tmp = new ClassList(className, attributeName, path); 
      String parent = field[f].getParent().getElementName().toString(); 
      String description = "Parent Class: " + parent; 
      tmp.setDataDescription(description); 
      getAttributeClassList().add(tmp); 
     } 

    } catch (JavaModelException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     subProgressMonitor.done(); 
    } 
} 

Répondre

0

Procédé travaillé() prend un entier comme le nombre d'unités de travail. On dirait que vous passez une valeur flottante arrondie à 0 et donc aucune modification n'est apportée à la barre de progression. Changez votre appel travaillé() pour passer en 1 et vous devriez voir la bonne progression.

+1

En effet, les moniteurs de progrès font le calcul pour vous. Vous lui dites combien il y a de "ticks", puis "tick it off" en appelant working(). N'écrivez jamais votre code pour attendre un SubProgressMonitor, il est juste là pour extraire la gestion d'un nombre de ticks dans un moniteur de progression parent tout en semblant avoir un nombre de ticks différent (par exemple parent a 5 ticks, subprogressmonitor est passé à votre méthode pour gérer 1 d'entre eux, mais elle-même agit comme si elle gère 10 ticks dans la méthode à laquelle elle a été transmise). Commencez/terminez simplement l'IProgressMonitor passé ou passez-le plus loin. – nitind

+0

Merci pour vos réponses. Maintenant ça fonctionne bien. – malib5

Questions connexes