es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El IProgressMonitor no es capaz de realizar la llamada al método monitor.isCanceled().

Buenas tardes y espero que estés muy bien 🙂

Tengo un método en el que he escrito un nuevo IRunnableWithProgress y estoy obteniendo correctamente la barra de progreso y actualizaciones de todo el proceso, sin ningún problema.

Mi problema es que puedo ver el botón de cancelar en el diálogo de la barra de progreso, pero después de hacer clic en él, no sucede nada. En resumen, el código dentro de if(monitor.isCanceled()){ sysout(“Heloooooooooo”) }no se ejecuta en absoluto.

Por favor, echa un vistazo al ejemplo de código:

public void runMappers(final EObject profile, final EObject list, final Notification notification) {
this.notification = notification;
getBroker().stopNotification();
final ProgressMonitorDialog pmd = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
IRunnableWithProgress rwp = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InterruptedException {
if (mappers.get(profile) != null) {
int workload = mappers.get(profile).size();
monitor.beginTask(“Loading DG list configurations”, workload);
Pattern pattern = Pattern.compile(“ProfileTo(.*?)ViewMapper”);
for (final ProfileToDgListViewMapper mapper : mappers.get(profile)) {
Matcher matcher = pattern.matcher(mapper.toString());
if (matcher.find()) {
monitor.subTask(“Loading DG list configuration section ” + (matcher.group(1)));
}
mapper.mapProfile(profile, list, notification);
monitor.worked(1);
if(monitor.isCanceled()){
System.out.println(“Heloooooooooo”);
monitor.done();
Thread.currentThread().interrupt();
return;
}
}
}
monitor.done();
}
};
try {
pmd.run(false, true, rwp);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
getBroker().continueNotification();
}

He intentado muchas cosas, también algunas respuestas de StackOverflow, sugiriendo realizarlo con Jobs, pero no estoy seguro de cómo puedo llamar a mi método personalizado (con algunos atributos) en el Job.
Por favor, hazme saber la mejor sugerencia
Gracias de antemano..

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    ¡Hola! Parece que estás experimentando un problema con el botón de cancelar en tu barra de progreso que no funciona. Después de revisar tu muestra de código, parece que el problema puede deberse a que no estás interrumpiendo correctamente el hilo cuando se presiona el botón de cancelar.

    En tu código actual, tienes las siguientes líneas en la declaración if cuando se presiona el botón de cancelar:

    monitor.done();
    Thread.currentThread().interrupt();
    return;
    

    Lo que te falta es llamar al método monitor.setCanceled(true) para realmente establecer el estado de cancelación del monitor. Es probable que esto sea por lo que tu código dentro del if nunca se esté ejecutando.

    Para interrumpir correctamente el hilo y cancelar la tarea, modifica tu código if para que se vea así:

    if (monitor.isCanceled()) {
        monitor.setCanceled(true);
        Thread.currentThread().interrupt();
        return;
    }
    

    Esto establecerá correctamente el estado de cancelación del monitor e interrumpirá el hilo, lo que provocará que se ejecute tu código dentro del if.

    Con respecto a tu pregunta acerca de llamar a tu método personalizado con algunos atributos en una tarea, puedes crear una nueva clase que extienda la clase Job y luego incluir tu método con sus atributos en el método run de la clase de trabajo.

    Por ejemplo, puedes crear una nueva clase así:

    public class MyJob extends Job {
        private EObject profile;
        private EObject list;
        private Notification notification;
    
        public MyJob(EObject profile, EObject list, Notification notification) {
            super("Mi tarea");
            this.profile = profile;
            this.list = list;
            this.notification = notification;
        }
    
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            // tu método personalizado aquí, con los atributos pasados ​​a través del constructor
            runMappers(profile, list, notification);
    
            if (monitor.isCanceled()) {
                return Status.CANCEL_STATUS;
            }
    
            return Status.OK_STATUS;
        }
    }
    

    Luego, para ejecutar tu método personalizado en una tarea, simplemente crea una nueva instancia de la clase MyJob con los atributos necesarios y llama al método schedule en el objeto de la tarea para ejecutarlo:

    MyJob job = new MyJob(profile, list, notification);
    job.schedule();
    

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.