Problème de threads

Signaler
Messages postés
34
Date d'inscription
samedi 6 novembre 2004
Statut
Membre
Dernière intervention
9 février 2009
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonsoir,
Voila pour être bref je developpe une petite appli pour mon telephone pour lire les flux RSS allociné bref tout vas bien pour la partie download du fichier RSS mais j ai voulu faire joli avec une progressbar pendant le chargement.
le problème avec ça c'est que ya pas moyen d'aprés ce que j'ai trouver pour synchroniser le chargement et l'avancement de la progressbar qu'en passant par les threads. Voila Big problem!
Je sais pas ce qui se passe mais le VS me parle de invoke dont j'ignore complètement l'usage.
Voila mon code qu'est ce qui ne va pas ??

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Threading;


namespace Allocine
{
public partial class Allocine : Form
{
XmlTextReader Lecteur_rss;
XmlDocument Doc_rss;
XmlNode noeud_Rss;
XmlNode noeud_Canal;
XmlNode noeud_Item;
ListViewItem colonne_News;
String lien_actif;
Thread thrd1;
Thread thrd2;
public Allocine()
{
InitializeComponent();
}

private void Allocine_Load(object sender, EventArgs e)
{

}

private void pictureBox1_Click(object sender, EventArgs e)
{

}

private void menuItem3_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/cine/cettesemaine";
Titresection.Text = "Film de cette semaine";
loading(lien_actif);
}

private void menuItem4_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/cine/alaffiche";
Titresection.Text = "Films encore à l'affiche";
loading(lien_actif);
}

private void menuItem5_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/cine/toppresse";
Titresection.Text = "Top critiques presse";
loading(lien_actif);
}

private void menuItem6_Click(object sender, EventArgs e)
{

lien_actif = "http://rss.allocine.fr/ac/cine/topspectateurs";
Titresection.Text = "Top critiques spéctateurs";
loading(lien_actif);
}

private void menuItem7_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/cine/prochainement";
Titresection.Text = "Prochaines sorties Films";
loading(lien_actif);
}

private void menuItem9_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/series/top";
Titresection.Text = "Top séries";
loading(lien_actif);
}

private void menuItem10_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/series/topstars";
Titresection.Text = "Top Stars de séries";
loading(lien_actif);
}

private void menuItem11_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/series/tvcesoir";
Titresection.Text = "Les séries ce soir";
loading(lien_actif);
}

private void menuItem13_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/dvd/nouveautes";
Titresection.Text = "Nouveautés DVD";
loading(lien_actif);
}

private void menuItem14_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/dvd/prochainement";
Titresection.Text = "Prochaines sorties DVD";
loading(lien_actif);
}

private void menuItem15_Click(object sender, EventArgs e)
{
lien_actif = "http://rss.allocine.fr/ac/dvd/topspectateurs";
Titresection.Text = "Top DVD spéctateurs";
loading(lien_actif);
}

public void loading(String lien)
{
if (this.panel2.Visible == true) this.panel2.Dispose();
thrd1 = new Thread(new ThreadStart(this.loading_progress));
thrd2 = new Thread(new ThreadStart(this.display_RSS));
thrd1.Start();
thrd2.Start();
}


public void loading_progress()
{
progbar.Value = 1;
progbar.Visible = true;
chargement.Visible = true;
progbar.Minimum = 0;
progbar.Maximum = 1000;
progbar.Value = progbar.Minimum;
while (progbar.Value < progbar.Maximum)
{
progbar.Value = progbar.Value+ 1;
}

chargement.Hide();
progbar.Hide();
this.thrd1.Abort();

}

public void display_RSS(String lien)
{

//On essay d'etablir la liaison avec le serveur suivant les liens données par le choix de lutilisateur
Lecteur_rss = new XmlTextReader(lien);
//On charge le flux comme etant un document XML
Doc_rss = new XmlDocument();
Doc_rss.Load(Lecteur_rss);
//Nous allons parcourir le document XML à la recherche des noeuds avec la balise <rss>
for (int i = 0; i < Doc_rss.ChildNodes.Count; i++)
{
if (Doc_rss.ChildNodes[i].Name == "rss")
{
noeud_Rss = Doc_rss.ChildNodes[i];
}
}
//Nous allons parcourir le document XML à la recherche des canaux avec la balise <rss>
for (int i = 0; i < noeud_Rss.ChildNodes.Count; i++)
{
if (noeud_Rss.ChildNodes[i].Name == "channel")
{
noeud_Canal = noeud_Rss.ChildNodes[i];
}
}
for (int i = 0; i < noeud_Canal.ChildNodes.Count; i++)
{
// If it is the item tag, then it has children tags which we will add as items to the ListView
if (noeud_Canal.ChildNodes[i].Name == "item")
{
noeud_Item = noeud_Canal.ChildNodes[i];

// Create a new row in the ListView containing information from inside the nodes
colonne_News = new ListViewItem();
colonne_News.Text = noeud_Item["title"].InnerText;
listelement.Items.Add(colonne_News);
}
}
this.thrd2.Abort();
}


public void listelement_SelectedIndexChanged_1(object sender, EventArgs e)
{
// When an items is selected
if (listelement.SelectedIndices.Count == 1)
{
// Loop through all the nodes under <channel>
for (int i = 0; i < noeud_Canal.ChildNodes.Count; i++)
{
// Until you find the node
if (noeud_Canal.ChildNodes[i].Name == "item")
{
// Store the item as a node
noeud_Item = noeud_Canal.ChildNodes[i];
// If the <title> tag matches the current selected item
int h = listelement.SelectedIndices[0];
if (noeud_Item["title"].InnerText.Equals(listelement.Items[h].Text))
{
StringBuilder sb = new StringBuilder();
sb.Append("<html><head></head> " + noeud_Item["description"].InnerText + " </html>");
Contenu.DocumentText = sb.ToString();
break;
}
}
}
}
}

private void menuItem16_Click(object sender, EventArgs e)
{
this.Dispose();
}


}


}


je bugggg merci d'avance</title></channel></rss></rss>

3 réponses

Messages postés
34
Date d'inscription
samedi 6 novembre 2004
Statut
Membre
Dernière intervention
9 février 2009

désolé pour l'affichage mais c opera qui propose pas de mise en page
Messages postés
34
Date d'inscription
samedi 6 novembre 2004
Statut
Membre
Dernière intervention
9 février 2009

Je reposte le code : désolé encore
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Threading;

namespace Allocine
{
    public partial class Allocine : Form
    {
        XmlTextReader Lecteur_rss;
        XmlDocument Doc_rss;
        XmlNode noeud_Rss;
        XmlNode noeud_Canal;
        XmlNode noeud_Item;
        ListViewItem colonne_News;
        String lien_actif;
        Thread thrd1;
        Thread thrd2;
        public Allocine()
        {
            InitializeComponent();
        }

        private void Allocine_Load(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
         
        }

        private void menuItem3_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/cine/cettesemaine";
            Titresection.Text = "Film de cette semaine";
            loading(lien_actif);
        }

        private void menuItem4_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/cine/alaffiche";
            Titresection.Text = "Films encore à l'affiche";
            loading(lien_actif);
        }

        private void menuItem5_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/cine/toppresse";
            Titresection.Text = "Top critiques presse";
            loading(lien_actif);
        }

        private void menuItem6_Click(object sender, EventArgs e)
        {
           
            lien_actif = "http://rss.allocine.fr/ac/cine/topspectateurs";
            Titresection.Text = "Top critiques spéctateurs";
            loading(lien_actif);
        }

        private void menuItem7_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/cine/prochainement";
            Titresection.Text = "Prochaines sorties Films";
            loading(lien_actif);
        }

        private void menuItem9_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/series/top";
            Titresection.Text = "Top séries";
            loading(lien_actif);
        }

        private void menuItem10_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/series/topstars";
            Titresection.Text = "Top Stars de séries";
            loading(lien_actif);
        }

        private void menuItem11_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/series/tvcesoir";
            Titresection.Text = "Les séries ce soir";
            loading(lien_actif);
        }

        private void menuItem13_Click(object sender, EventArgs e)
        { 
            lien_actif = "http://rss.allocine.fr/ac/dvd/nouveautes";
            Titresection.Text = "Nouveautés DVD";
            loading(lien_actif);
        }

        private void menuItem14_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/dvd/prochainement";
            Titresection.Text = "Prochaines sorties DVD";
            loading(lien_actif);
        }

        private void menuItem15_Click(object sender, EventArgs e)
        {
            lien_actif = "http://rss.allocine.fr/ac/dvd/topspectateurs";
            Titresection.Text = "Top DVD spéctateurs";
            loading(lien_actif);
        }

        public void loading(String lien)
        {
            if (this.panel2.Visible == true) this.panel2.Dispose();
            thrd1 = new Thread(new ThreadStart(this.loading_progress));
            thrd2 = new Thread(new ThreadStart(this.display_RSS));
            thrd1.Start();
            thrd2.Start();
        }

        public void loading_progress()
        {
            progbar.Value = 1;
            progbar.Visible = true;
            chargement.Visible = true;
            progbar.Minimum = 0;
            progbar.Maximum = 1000;
            progbar.Value = progbar.Minimum;
            while (progbar.Value < progbar.Maximum)
            {
                progbar.Value = progbar.Value+ 1;
            }
           
            chargement.Hide();
            progbar.Hide();
            this.thrd1.Abort();
           
        }

        public void display_RSS(String lien)
        {
           
            //On essay d'etablir la liaison avec le serveur suivant les liens données par le choix de lutilisateur
            Lecteur_rss = new XmlTextReader(lien);
            //On charge le flux comme etant un document XML
            Doc_rss = new XmlDocument();
            Doc_rss.Load(Lecteur_rss);
            //Nous allons parcourir le document XML à la recherche des noeuds avec la balise <rss>
            for (int i = 0; i < Doc_rss.ChildNodes.Count; i++)
            {
                if (Doc_rss.ChildNodes[i].Name == "rss")
                {
                    noeud_Rss = Doc_rss.ChildNodes[i];
                }
            }
            //Nous allons parcourir le document XML à la recherche des canaux avec la balise <rss>
            for (int i = 0; i < noeud_Rss.ChildNodes.Count; i++)
            {
                if (noeud_Rss.ChildNodes[i].Name == "channel")
                {
                    noeud_Canal = noeud_Rss.ChildNodes[i];
                }
            }
            for (int i = 0; i < noeud_Canal.ChildNodes.Count; i++)
            {
                // If it is the item tag, then it has children tags which we will add as items to the ListView
                if (noeud_Canal.ChildNodes[i].Name == "item")
                {
                    noeud_Item = noeud_Canal.ChildNodes[i];

                    // Create a new row in the ListView containing information from inside the nodes
                    colonne_News = new ListViewItem();
                    colonne_News.Text = noeud_Item["title"].InnerText;
                    listelement.Items.Add(colonne_News);
                }
            }
            this.thrd2.Abort();
        }

        public void listelement_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            // When an items is selected
            if (listelement.SelectedIndices.Count == 1)
            {
                // Loop through all the nodes under <channel>
                for (int i = 0; i < noeud_Canal.ChildNodes.Count; i++)
                {
                    // Until you find the node
                    if (noeud_Canal.ChildNodes[i].Name == "item")
                    {
                        // Store the item as a node
                        noeud_Item = noeud_Canal.ChildNodes[i];
                        // If the <title> tag matches the current selected item
                        int h = listelement.SelectedIndices[0];
                        if (noeud_Item["title"].InnerText.Equals(listelement.Items[h].Text))
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.Append("<html><head></head> " + noeud_Item["description"].InnerText + " </html>");
                            Contenu.DocumentText = sb.ToString();
                            break;
                        }
                    }
                }
            }
        }

        private void menuItem16_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

       
    }

      
}

merci et désolé encore
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Bonsoir,
Pour le problème des threads, tu peux regarder ici:
http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx

Sinon, la façon dont tu lis ton fichier XML c'est pas vraiment l'pied... regarde du côté de XPath
http://www.csharpfr.com/tutorial.aspx?ID=536

Ou encore mieux, de LinqToXml...

<hr />
-Blog-
-Site Perso-