IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Se partager la console avec un Thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut Se partager la console avec un Thread
    Bonjour à tous

    Je viens de développer une petite application console qui éffectuée une mise à jour sur une base de donnée.

    Mon application générale lance un thread qui va s'occuper de mettre à jour la base.

    Pendant que ce thread de mise à jour s'éxécute, jai une boucle dans mon programme principe qui affiche "Mise à jour en cours" avec un | / - \ | / - \ | qui tourne.

    Dans mon thread, si une erreur SQL se produit, (si je tombe dans un catch,) je souhaiterai afficher sur la console l'erreur. Le problèem est que pendant ce temps là, la console est déja utilisée par mon programme principal.

    Je n'ai jamais été confronté à ce soucis, et je ne sais pas trop comment m'orienter.

    voici le fonctionnement de mon programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    Classe principale :
     
            public int LaunchUpdate()
            {
     
                // ***********************************************
     
                // Déclaration du thread
    		  //  Thread myThread;
     
    		    // Instanciation du thread, on spécifie dans le 
    		    // délégué ThreadStart le nom de la méthode qui
    		    // sera exécutée lorsque l'on appele la méthode
    		    // Start() de notre thread.
    		    myThread = new Thread(new ThreadStart(UpdateDataBaseNow));
     
    		    // *****************************************************
                // *** Lancement du thread ( MISE A JOUR DE LA BASE )
                // *****************************************************
               myThread.Start();
                //******************************************************
     
                // Tant que le thread n'est pas tué
                while (myThread.IsAlive)
                {
                    Console.Write("| Mise à jour en cours .... |");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write("/ Mise à jour en cours .... /");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write("- Mise à jour en cours .... -");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write(@"\ Mise à jour en cours .... \");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write("| Mise à jour en cours .... |");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write("/ Mise à jour en cours .... /");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write("- Mise à jour en cours .... -");
                    Thread.Sleep(100);
                    Console.Clear();
                    Console.Write(@"\ Mise à jour en cours .... \");
                    Thread.Sleep(100);
                    Console.Clear();
                }
     
     
                return 0;
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    private void UpdateDataBaseNow()
            {
     
                    string strError;
                    string delimiter = "\t";
                    int nbLignesTraited = 0;
                    int nI = 0;
     
                    m_TxtReader = new StreamReader(m_strFileToImport, m_encoding);
                    m_TxtReader.ReadLine(); // On lit la première ligne car elle contient les entête de colonnes
     
                    m_nNbInsert = 0;
                    m_nNbUpdate = 0;
                    m_nErrorMaj = 0;
     
                    while (m_TxtReader.Peek() >= 0)
                    {
     
                        string[] items = m_TxtReader.ReadLine().Split(delimiter.ToCharArray());
     
                        for (int nJ = 0; nJ <= items.Count() - 1; nJ++)
                        {
                            items[nJ] = items[nJ].Replace("'", "''");
     
                        }
     
                        // A ce stade, le tableau "items" contient tous les champs de la ligne courante
     
                        if (items.Count() >= 226)
                        {
     
                            string strCli_Note = items[0] +
                            ((char)13).ToString() + "Géré par : " + items[232] +
                            ((char)13).ToString() + "Tel abgrégé : " + items[161] +
                            ((char)13).ToString() + "Tel : " + items[9] + " Fax : " + items[10] +
                            ((char)13).ToString() + "Adr : " + items[2] +
                            ((char)13).ToString() + "      " + items[7] + " " + items[5] + " " + items[8] +
                            ((char)13).ToString() + "Commercial AI : " + items[28] +
                            ((char)13).ToString() + "Assistance : " + items[145] +
                            ((char)13).ToString() + "Info INQUIERO : " + items[231];
     
                            // ***********************************************
                            // Nous sommes dans les clients/contacts/Logiciels
                            // ***********************************************
     
                            # region Mise à jour des clients
     
                            m_DbCommand_Clients.CommandText = "Select * from " + m_strNomTable_Client + " where clidesig = '" + items[0] + "'";
     
                            OleDbDataAdapter myDbAdapter = new OleDbDataAdapter(m_DbCommand_Clients);
                            DataSet DataSet = new DataSet();
                            try
                            {
                                myDbAdapter.Fill(DataSet, "Vars");
                                DataTable dt = DataSet.Tables[0];
     
                                if (dt.Rows.Count > 0)
                                {
                                    //************************************************
                                    // La fiche CLIENT existe déja, on va la modifier
                                    //************************************************
                                    foreach (DataRow dr in dt.Rows)
                                    {
     
                                        // Pour chaque enregistrement trouvés, on va mettre à jour le client
                                        m_DbCommand_Clients.CommandText = "Update " + m_strNomTable_Client + " SET cliadlig1 = '" + items[2] + "'," +
                                        "cliadlig2 = '" + items[3] + "', cliadlig3 = '" + items[4] + "', cliadville = '" + items[5] + "'," +
                                        "cliadcpost = '" + items[7] + "', cliadpays = '" + items[8] + "', cliadtel= '" + items[9] + "'," +
                                        "cliadfax = '" + items[10] + "', clivendeur = '" + items[28] + "', cliactiv= '" + items[29] + "'," +
                                        "clieffect ='" + items[30] + "', clinaf = '" + items[43] + "', cliassist = '" + items[145] + "'," +
                                        "clicode='" + items[164] + "',cliregroup = '" + items[229] + "'" + ",clinquiero = '" + items[231] + "',"
                                        + "clirev_pho='" + items[102] + "',cligerepar='" + items[232] + "', clinotes ='" + strCli_Note + "'" +
                                        " WHERE clidesig = '" + @items[0] + "'";
     
     
                                        nbLignesTraited = m_DbCommand_Clients.ExecuteNonQuery();
     
                                        if (nbLignesTraited == 0)
                                        {
                                            m_nErrorMaj++;
                                        }
                                        else
                                        {
                                            m_nNbUpdate += nbLignesTraited;
                                        }
     
                                    }
                                }
                                else
                                {
                                    //************************************************
                                    // La fiche CLIENT n'existe pas, on va la créer
                                    //************************************************
                                    m_DbCommand_Clients.CommandText = "Insert into " + m_strNomTable_Client + " (clidesig,cliadlig1,cliadlig2,cliadlig3,cliadville,cliadcpost," +
                                    "cliadpays,cliadtel,cliadfax,clivendeur,cliactiv,clieffect,clinaf,cliassist,clicode,cliregroup,clirev_pho, cligerepar,cliinfomnt,cliinfolib," +
                                    "clitelabrg,clinquiero,clinotes) VALUES (" +
                                    "'" + items[0] + "'" + "," + "'" + items[2] + "'" + "," + "'" + items[3] + "'" + "," + "'" + items[4] + "'" + "," + "'" + items[5] + "'" +
                                    "," + "'" + items[7] + "'" + "," + "'" + items[8] + "'" + "," + "'" + items[9] + "'" + "," + "'" + items[10] + "'" + "," + "'" + items[28] + "'" +
                                    "," + "'" + items[29] + "'" + "," + "'" + items[30] + "'" + "," + "'" + items[43] + "'" + "," + "'" + items[145] + "'" + "," + "'" + items[164]
                                    + "'" + "," + "'" + items[229] + "'" + "," + "'" + items[102] + "'" + "," + "'" + items[232] + "'" + "," + "' '" + "," + "' '" + "," + "' '" +
                                    "," + "'" + items[231] + "'" + "," + "'" + strCli_Note + "'" + ")";
     
                                    nbLignesTraited = m_DbCommand_Clients.ExecuteNonQuery();
     
                                    if (nbLignesTraited == 0)
                                    {
                                        m_nErrorMaj++;
                                    }
                                    else
                                    {
                                        m_nNbInsert++;
                                    }
     
                                }
     
                            }
                            catch (Exception ex)
                            {
                                strError = "Erreur : " + ex.Message;
                                maConsole.AfficheMessage(strError);
                            }
    }
    Dans le seconde bloc [code], regardez à la ligne 121, c'est ici que je souhaite afficher le message d'erreur sur la console et en arrêtant an boucle qui affiche "mise à jour en cours". Pour infos, maConsole.AffichageMessage() est une petite classe qui utilise console.writeline.

    J'éspère ne pas avoir été assez clair dans mon explication

    Auriez vous des pistes pour m'aider ?

    Je vous remercie tous d'avance

    Bien cordialement,

    Nixeus

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 201
    Par défaut
    Quel est le comportement que tu souhaites avoir?

    Sinon je dirai simplement que de faire un seul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while (myThread.IsAlive)
                {
                    Console.Clear(); 
                    Console.Write("| Mise à jour en cours .... |");
                    Thread.Sleep(100); // un dixième de seconde? c'est court                
                }
    if(hasError) {
     Console.WriteLine("Press Any Key");
     Console.Read();
    }

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    Bonjour et merci de ta réponse,

    Je souhaite que le catch arrête le thread, et que le message d'erreur ex.message soit affiché dans la console ( et donc que la boucle qui tourne et utilise la console soit stoppée ).

    Merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 201
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ....
    catch (Exception ex)
                            {
                                strError = "Erreur : " + ex.Message;
                                maConsole.AfficheMessage(strError);
                                hasError=true;
                            }
    + le code précédent ca ne marche pas?

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    J'ai réussi à régler le soucis en faisant une variable strStringError, puis si j'ai une erreur je quitte le thread, puis je termine ma boucle While(). Ca reste de la bidouille
    Je vais tenter ta méthode ! je ne connais pas ce "HasError"

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 201
    Par défaut
    euh c'est une variable que tu dois déclarer :p

Discussions similaires

  1. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46
  2. Réponses: 5
    Dernier message: 10/05/2005, 10h22
  3. [langage] Perl a t'il été compiler avec les threads
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2005, 15h00
  4. Réponses: 2
    Dernier message: 30/09/2003, 15h57
  5. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo