2016-05-09 5 views
0

Ich führe eine lange laufende Operation und zeigt Nachrichtendialog als "Holen von Details" und Schließen derselben, sobald die Operation ausgeführt wird.MessageDialog Titel kommt 'nicht reagiert'

try{ 
MessageDialog dialog = new MessageDialog(Display.getDefault().getActiveShell(), "Information", null, "Fetching Details...", MessageDialog.NONE , new String[] {}, -1); 
dialog.setBlockOnOpen(false); 
dialog.open(); 
//Schedule long Running operations 

} finally{ 
    dialog.close() 
} 

Wenn der Vorgang mehr Zeit in Anspruch nimmt, wird Dialog zeigt nicht reagiert (Titel ändert sich auf „Information (reagiert nicht)“).

Wie kann der Status nicht reagieren vermieden werden?

Antwort

2

Sie dürfen im UI-Thread keine langen Operationen ausführen. Dadurch wird der Thread blockiert, bis er fertig ist und die Benutzeroberfläche nicht mehr reagiert.

Führen Sie Ihre Operationen in einem Hintergrundthread oder einem Eclipse-Job oder sogar einem Java 8 CompleteableFuture aus.

Verwenden Sie die DisplayasyncExec in Ihrem Hintergrundcode, um die Benutzeroberfläche wie erforderlich zu aktualisieren.

Eine weitere Alternative ist ProgressMonitorDialog zu verwenden:

ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); 

try { 
    dialog.run(true, true, new IRunnableWithProgress() { 
    @Override 
    public void run(IProgressMonitor monitor) { 
     monitor.beginTask("Task name", IProgressMonitor.UNKNOWN); 
     try { 
     // TODO your long running code 
     // TODO check monitor.isCanceled() as often as possible 
     } 
     finally { 
     monitor.done(); 
     } 
    } 
    }); 
} 
... catch exceptions 
+0

Dank Greg! Ich habe den ProgressMonitorDialog-Ansatz verwendet, um mein Problem zu lösen. – Priyadarshini