web-dev-qa-db-fra.com

Le crochet d'arrêt ne fonctionne pas dans Eclipse

J'ai ajouté un crochet d'arrêt via:

Runtime.getRuntime().addShutdownHook(myShutdownHook);

Cela fonctionne normalement, mais pas lorsque je clique sur le bouton d'arrêt rouge dans Eclipse. Existe-t-il un moyen d’appeler le point d’arrêt dans Eclipse?

24
urir

Le bouton d’arrêt rouge tue de force l’application, c’est-à-dire pas de manière élégante, de sorte que la machine virtuelle Java ne sache pas que l’application est en train de se fermer. Par conséquent, les points d’arrêt à l’arrêt ne sont pas appelés.

Malheureusement, il n’existe aucun moyen (du moins sous Windows) de fournir un mécanisme garantissant que le hook est toujours appelé. C'est juste quelque chose qui peut être invoqué, mais il n'y a aucune garantie.

15
Zoltán

J'ai fait un bidouillage en remplaçant JavaProcess par un décoré:

    IProcess p = launch.getProcesses()[0];
    launch.addProcess(new JavaProcessDecorator(p));
    launch.removeProcess(p);

Et le décorateur annule la fonction de terminaison.

public class JavaProcessDecorator implements IProcess {

private IProcess p;

public JavaProcessDecorator(IProcess p) {
    this.p = p;
}

private boolean sigkill = false;

@SuppressWarnings("rawtypes")
@Override public Object        getAdapter(Class arg)                { return p.getAdapter(arg); }
...
@Override public ILaunch       getLaunch()                          { return p.getLaunch(); }
@Override public IStreamsProxy getStreamsProxy()                    { return p.getStreamsProxy(); }
@Override public void          setAttribute(String s1, String s2)   {        p.setAttribute(s1, s2); }
@Override public void          terminate() throws DebugException    {
    if(!sigkill) {
        try {
            IDebugIService cs = DirmiServer.INSTANCE.getRemote("main", IDebugIService.class);
            if(cs != null) cs.modelEvent(new TerminateRequest());
        } catch (RemoteException e) { }
        this.sigkill = true;
    } else p.terminate();
}}

Au premier clic sur le bouton rouge, j'envoie un message à l'application pour lui demander de mettre fin doucement. Si cela ne fonctionne pas, un deuxième clic sur le bouton rouge le tuera. 

8
Marek Jagielski

Je sais que je suis un peu en retard à la fête, mais j'ai trouvé ce fil en quête d'aide et donc probablement d'autres.

Nous avons eu le même problème et nous l'avons résolu avec un plugin Eclipse (sous Linux) qui fournit maintenant des boutons d'arrêt supplémentaires. J'espère que cela vous sert à tous et que cela nous a aidé :)

1
Christoph142

Le bouton d’arrêt rouge vient juste de terminer l’application et, selon les développeurs d’Eclipse, ils ne peuvent rien y faire, voyez ce problème dans le suivi des bogues Eclipse. 

0
Mubashar Ahmad

@Pacerier - Depuis la Javadoc: Dans de rares circonstances, la machine virtuelle peut abandonner, c'est-à-dire arrêter de fonctionner sans s'éteindre proprement. Cela se produit lorsque la machine virtuelle est terminée de manière externe, par exemple avec le signal SIGKILL sous Unix ou l'appel TerminateProcess sous Microsoft Windows. La machine virtuelle peut également abandonner si une méthode native échoue, par exemple en corrompant des structures de données internes ou en tentant d'accéder à une mémoire inexistante. Si la machine virtuelle est abandonnée, aucune garantie ne peut être donnée quant à l'exécution ou non de points d'ancrage.

0
user2088211