2016-11-19 1 views
0

J'ai une classe "HConnection" contenant plusieurs méthodes telles que abort(); et awaitConnection();Méthode d'objet exécutable exécutable ne répondant pas aux modifications

Le paramètre awaitConnection(); méthode est appelée dans ma classe principale SWT Form en utilisant un thread exécutable. Quoi qu'il en soit, quand j'abandonne() la connexion HC, la fonction awaitConnection n'est pas abandonnée alors qu'elle devrait l'être.

Jetez un oeil à cet instantané de mon code principal:

private HConnection connectie; 

private void btnConnect_clicked(SelectionEvent e) { 

    if (btnNewButton_1.getText().equals("Connect")) { 
     String Url = combo.getText(); 
     connectie = new HConnection(Url); 
     connectie.prepare(); 

     new Thread(new Runnable() { 
       public void run() { 
        connectie.awaitConnection(); 

        Display.getDefault().asyncExec(new Runnable() { 
         public void run() { 
          lblNewLabel_2.setText("Waiting -> client"); 
          if (connectie.getState() == 2) { 
           lblNewLabel_2.setText("Replacing URL"); 
          } 
          else { 
           lblNewLabel_2.setText("Failed"); 
           connectie.abort(); 
           btnNewButton_1.setText("Connect"); 
          } 
         } 
        }); 
        if (connectie.getState() == 2) { 
         // go on 

        } 
       } 
     }).start(); 

     //////// 

     btnNewButton_1.setText("Abort"); 
    } 
    else if(btnNewButton_1.getText().equals("Abort")) { 
     connectie.abort(); 
     lblNewLabel_2.setText("Aborted"); 
     btnNewButton_1.setText("Connect"); 
    } 

Et un aperçu de HConnection:

public void prepare() { 
    addToHostsFile("127.0.0.1" + "\t" + domain); 
    state = 1; 
} 

public void abort() { 
    removeFromHostsFile("127.0.0.1" + "\t" + domain); 
    waitingConnection = false; 
    HostFileEdited = false; 
    state = 0; 
} 

public void awaitConnection() { 
    if (state == 1) { 
     waitingConnection = true; 
     System.out.println("0"); 
     while (/* not found && */ state == 1) { 

      // code 

     } 
     System.out.println("1"); 
     waitingConnection = false; 
     if (state == 1) state = 2; 
    } 

} 

Une note plus; la fonction abort() a effectivement fonctionné et a terminé le thread quand j'ai essayé d'appeler connectie.abort() directement après le thread.start() ;, (placé "////////" dans le code ci-dessus à cet endroit) Mais si on l'appelle là où il devrait être appelé, il fait ce qu'il doit faire tout

lblNewLabel_2.setText("Aborted"); 
btnNewButton_1.setText("Connect"); 

font leur travail comme prévu

+0

Peut-être que votre bloc else à l'intérieur de la méthode run() n'est pas exécuté –

+0

@VikasSachdeva non ce n'est pas le problème – JonasAnon

+1

Parfois, les threads ne démarrent pas immédiatement, donc quand vous appelez abort après avoir appelé 'start' sur votre thread, le' awaitConnection() 'ne peut même pas être invoqué –

Répondre

1

Faites votre état et awaitConnection volatile:

private volatile int state; 
private volatile boolean awaitConnection; 
+0

Cela l'a fait! Merci – JonasAnon