Ligne qui bloque tout mon programme.

reywas Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
mimi-bouzid Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour !

Parfois quand je me déconnecte d'internet ou quand ma box plante, le thread que j'ai créé ne se termine tout simplement jamais.
D'après mes recherches, cela vient de la ligne connection.getInputStream() qui attend tout simplement un EOF (end of file) qui n'arrive jamais puisque la connexion est rompue.

J'essaye donc par tout les moyen de stopper cette &*!?% de ligne mais rien n'y fait je galère depuis au moins 3 jours...

En gros je lance mon thread et 20 secondes plus tard, j'utilise L.interrupt dans le cas où mon thread n'est pas terminé mais ça ne fonctionne tout simplement pas.

Comment puis-je y remedier ?

public static void jelancecettefonction()
{	
	Thread t = new thread();
		
	t.start();
		
	Syst.sleep(20000);
		
	System.out.println("interruption !");
	t.interrupt();
}

public void run()
{
	System.out.print("debut thread !");
		
	try 
	{
		for(int a=0;a<20;a++)
		{
			System.out.println("a");

			HttpURLConnection connection = null;

			System.out.println("b");

			URL url = new URL("http://192.168.1.1/index.cgi/");

			System.out.println("c");

			connection = (HttpURLConnection) url.openConnection();

			System.out.println("d");

			BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

			System.out.println("e");
		}
	}
	catch(Exception e)
	{
		System.out.print("Le thread s'est terminé par une exception.");
	}
		
	System.out.print("fin thread !");
}


Merci d'avance si vous pouvez m'aider !

Cordialement,
Reywas
A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
J'ai un peu du mal avec ta méthode jelancecettefonction(), est-ce que

public static void jelancecettefonction()
{	
	Thread t = new thread(); // 1
	
	t.start();
			
	Syst.sleep(20000); // 2
	
	System.out.println("interruption !");
	t.interrupt();
}

1) est-ce que la classe thread (avec un t minuscule) est juste une faute de frappe, ou est-ce que c'est une autre classe personnelle ?
2) qu'est-ce que c'est cette classe "Syst" et que fait la méthode sleep ? en particulier, est-ce qu'elle gère correctement les exceptions d'interruption ?

Sinon, pour en revenir à ton run, je pense qu'avec un Scanner à la place de ton BufferedReader tu devrais pouvoir détecter la fermeture de la connexion avec les tests hasNext, il faut tester pour vérifier.

PS. J'ai mis en place les tests d'interruptions, c'est important, on en a déjà parlé l'autre jour dans ton autre discussion Interrompre un thread correctement.

public void run()
{
    System.out.println("debut thread !");
    
    URL url;
    
    try 
    {
        url = new URL("http://192.168.1.1/index.cgi/");
    }
    catch (MalformedURLException e) 
    {
        e.printStackTrace();
        return;
    }
        
    for(int a=0; a<20; a++)
    {
        if (isInterrupted())
        {
            new InterruptedException("Interruption détectée").printStackTrace();
            return;
        }
        
        System.out.println("a");
        
        Scanner sc = null;
        
        try
        {
            sc = new Scanner(url.openStream());
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
            return;
        }

        System.out.println("b");
        
        while (sc.hasNextLine())
        {    
            if (isInterrupted())
            {
                sc.close();
                new InterruptedException("Interruption détectée").printStackTrace();
                return;
            }
            
            System.out.println(sc.nextLine());
        }
        
        System.out.println("c");
        
        sc.close();

        System.out.println("d");
    }
        
    System.out.print("fin thread !");
}
1
reywas Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonsoir !

Pour répondre à tes question :
1. Non ce n'était pas une faute de frappe mais bien une autre classe, dont le nom était je l'admets très mal choisi. ^^
2. Oups j'avais laissé une petite coquille. En gros c'est juste un Thread.sleep(5000).

Voici le code corrigé :

public static void jelancecettefonction()
{	
	Thread t = new MonObjet();
		
	t.start();
		
	Thread.sleep(5000);  

	t.interrupt();
}

// La méthode run de la classe MonObjet.
public void run()
{
	System.out.print("debut thread !");
		
	try 
	{
		for(int a=0;a<20;a++)
		{
			System.out.println("a");

			HttpURLConnection connection = null;

			System.out.println("b");

			URL url = new URL("http://192.168.1.1/index.cgi/");

			System.out.println("c");

			connection = (HttpURLConnection) url.openConnection();

			System.out.println("d");

			BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

			System.out.println("e");
		}
	}
	catch(Exception e)
	{
		System.out.print("Le thread s'est terminé par une exception.");
	}
		
	System.out.print("fin thread !");
}


Citation :
"Sinon, pour en revenir à ton run, je pense qu'avec un Scanner à la place de ton BufferedReader tu devrais pouvoir détecter la fermeture de la connexion avec les tests hasNext, il faut tester pour vérifier."

Hum le problème c'est que là dans mon exemple j'ai pris que les lignes qui étaient nécessaires pour comprendre mais j'ai besoin de mon bufferedreader. (y'a des histoires de cookies, de sessions etc)
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > reywas Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
En fait j'avais pris Scanner parce que je pensais que tu lisais une page html, je n'avais pas fais attention à ton extension .cgi (que je ne connais pas)

Cependant le BufferedReader dispose aussi d'une méthode de test qui permet de savoir si tu es toujours en mesure de lire des données, c'est la méthode ready().

Remarque : je reprends mon code, parce qu'il prends en charge les interruptions que tu n'as pas mis en place dans ton code et qu'il est pourtant important de mettre en place puisque tu veux faire des interrupt() sur ton thread, et que leur détection doit permettre malgré tout de libérer les ressources utilisées par le thread (la connexion en particulier)

public void run()
{
    System.out.println("debut thread !");
    
    URL url;
    
    try 
    {
        url = new URL("http://192.168.1.1/index.cgi/");
    }
    catch (MalformedURLException e) 
    {
        e.printStackTrace();
        return;
    }
    
    for (int a=0; a<20; a++)
    {
        if (isInterrupted())
        {
            new InterruptedException("Interruption détectée").printStackTrace();
            return;
        }
        
        BufferedReader br;
        
        try
        {
            br = new BufferedReader(new InputStreamReader(url.openStream()));
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
            continue;
        }
        
        try
        {
            while (br.ready())
            {    
                if (isInterrupted())
                {
                    new InterruptedException("Interruption détectée").printStackTrace();
                    
                    try
                    {
                        br.close();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    
                    return;
                }
                
                System.out.println(br.readLine()); // ou autre chose
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
        try
        {
            br.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
        
    System.out.print("fin thread !");
}
0
mimi-bouzid Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   1
 
essaye de mettre e.Message.tostring(); dans le system.out.println de ton exception regarde le code d'erreur généré :)
0