Ligne qui bloque tout mon programme.

Fermé
reywas Messages postés 19 Date d'inscription dimanche 29 août 2010 Statut Membre Dernière intervention 1 mars 2013 - 15 févr. 2013 à 12:22
mimi-bouzid Messages postés 10 Date d'inscription samedi 16 février 2013 Statut Membre Dernière intervention 17 février 2013 - 16 févr. 2013 à 22:51
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
15 févr. 2013 à 14:57
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 dimanche 29 août 2010 Statut Membre Dernière intervention 1 mars 2013 1
Modifié par reywas le 15/02/2013 à 18:55
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > reywas Messages postés 19 Date d'inscription dimanche 29 août 2010 Statut Membre Dernière intervention 1 mars 2013
Modifié par KX le 15/02/2013 à 19:15
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 samedi 16 février 2013 Statut Membre Dernière intervention 17 février 2013 1
16 févr. 2013 à 22:51
essaye de mettre e.Message.tostring(); dans le system.out.println de ton exception regarde le code d'erreur généré :)
0