2016-12-01 3 views
0

Hintergrund: Ich erstelle ein Plug-in, das einen anderen Plug-in-Befehl auslöst. Dieser Befehl führt eine Überprüfung durch (Hintergrundprozess) und implementiert Markierungen für bestimmte Programme.Warten auf den Job im Arbeitsbereich zu beenden

Problem: Ich habe erfolgreich den Befehl programmgesteuert ausgelöst, aber ich muss warten, bis es fertig ist, denn wenn ich nicht warten, werde ich nur NULL Satz von Markern [] erhalten.

Bisher ist hier, was ich habe

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IResource resource = workspace.getRoot(); 
resource.deleteMarkers(null, true, 0); 
markers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); 
Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_F2); 
robot.keyRelease(KeyEvent.VK_CONTROL); 
robot.keyRelease(KeyEvent.VK_SHIFT);  
robot.keyRelease(KeyEvent.VK_F2); 

//...command is executed, now running background process 
//...wait for all background process to finish 

for (IMarker m : markers) { 
    System.out.println("Id: " + m.getId()); 
    System.out.println("Message: " + m.getAttribute(IMarker.MESSAGE)); 
    System.out.println("Line Number: " + m.getAttribute(IMarker.LINE_NUMBER)); 
} 

ich versucht habe, die Umsetzung dieses

ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { 
    public void run(IProgressMonitor monitor) throws CoreException { 

    } 
}, new NullProgressMonitor()); 

wie hier erklärt: https://dzone.com/articles/eclipse-gui-testing-is-viable-

  1. Anstatt sleep() zu verwenden, um auf etwas zu warten, warten Sie, bis die eigentliche Aufgabe erledigt ist. Bei einer stark belasteten Maschine können die Verarbeitungszeiten variieren. Anstatt einen zerbrechlichen Schlaf (500L) zu haben, verwenden Sie eine zuverlässige Technik, um festzustellen, wann der Job wirklich erledigt ist.

Zum Beispiel, wenn Sie wissen, dass Ihre Bearbeitung eine Ressource Sperre hält, senden Sie uns eine no-op leeren Arbeitsbereich Job und warten auf sie in Ihrem Test. Es wird nur einmal alle anderen Ressourcensperren aufgerufen werden freigegeben sind, so dass, wenn es fertig ist sind Sie garantiert, dass Ihre anderen Job

getan wird

Aber ich denke, ich es falsch bin der Umsetzung, da sie nicht für die nicht warten Hintergrundjobs zum Abschluss.

Alle Ratschläge, was zu tun ist, werden definitiv helfen!

Edit: Um hinzuzufügen, ist der Job/Task/Prozess, der ausgeführt wurde, von einem anderen Plug-in, das ich nicht kenne. Daher kenne ich die Jobgruppe nicht. Alles worauf ich vertraue, ist, auf die Aufgabe zu warten.

Antwort

0

bin ich nicht sicher, aber man kann versuchen IJobManager zu verwenden:

private void waitJobsComplete() { 
    final IJobManager manager = Job.getJobManager(); 
    final Job[] jobs = manager.find(null); //return all jobs 
    while(jobExists(jobs)) { 
    sleep(50); 
    } 
} 
private boolean jobExists(Job[] jobs) { 
    for(Job job: jobs) { 
    if(job.getState() != Job.NONE) { 
     return true; 
    } 
    } 
    return false; 
} 
+0

Hallo. Vielen Dank! Dadurch wird jedoch die gesamte Eclipse-Workbench eingefroren, da sie auf demselben Thread ausgeführt wird. Ich kann es nicht in Async schreiben, da es nicht darauf wartet, dass die Hintergrundprozesse beendet werden. –

0

Der Artikel, den Sie sich über WorkspaceJob sprechen verweisen, würden Sie tun, was es schon sagt, wie etwas mit:

Job job = new WorkspaceJob("name") 
{ 
    @Override 
    public IStatus runInWorkspace(IProgressMonitor monitor) 
    throws CoreException 
    { 
    return Status.OK_STATUS; 
    } 
}; 

job.schedule(); 

try 
{ 
    job.join(); 
} 
catch (InterruptedException e) 
{ 
    // 
} 
+0

Hallo @ greg-449, danke. Wenn ich es jedoch ausprobiere, wartet es nicht darauf, dass Hintergrundprozesse beendet werden. Der Code geht weiter, fehlt mir etwas oder gibt es einen anderen Ansatz? –

+0

Da Sie uns nicht gesagt haben, welchen Befehl Sie ausführen, ist es unmöglich zu sagen, was Sie tun müssen, um auf die Fertigstellung zu warten. –

+0

Hi @ greg-449, im Grunde tut es eine Code-Prüfung des gerade geöffneten Programms im Editor. Nach dem Check öffnet es seine eigene Ansicht und zeigt die Probleme/Marker an. –

Verwandte Themen