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

Windows Forms Discussion :

[c#] Problème avec mes thread/delegate


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 43
    Points : 41
    Points
    41
    Par défaut [c#] Problème avec mes thread/delegate
    Bonjour,

    j'ai une fonction qui endort le thread courant indefiniment pour attendre des evennements. Donc pas de problème je fait un delegate dessus mais je ne recois aucun evennement... qui sont recueillis dans une autre fonction.

    Voici mon code:

    Le code de ma fonction qui bloque le thread courant
    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
     
    public void thstart()
            {
                try
                {
                    WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_ThreadStartTrace where ProcessID>5");
                     watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
                    watcher.Start();
                    System.Threading.Thread.Sleep(-1);
                    watcher.Stop();
                    return;
                }
                catch (ManagementException err)
                {
                    richTextBox1.Text += ("Erreur: " + err.Message);
                }
            }
    Le code de lancement de la fonction ci dessus avec le delegate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public delegate void delegatethstart();
     
    private void button1_Click(object sender, EventArgs e)
            {
                delegatethstart dele_thread = new delegatethstart(thstart);
                IAsyncResult iAr;
                iAr = dele_thread.BeginInvoke(null, null);
                richTextBox1.Text += ("En attente du processus..." + textBox1.Text);
            }
    et enfin le code de la fonction qui recoit les evenements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void HandleEvent(object sender, EventArrivedEventArgs e)
            {
                    richTextBox1.Text += ("Nom process:" + e.NewEvent["ThreadID"]);
                    richTextBox1.Text += ("pid PROCESS: " + e.NewEvent["ProcessID"]);
                    richTextBox1.Text += ("Pid thread :" + e.NewEvent["ThreadID"]);
    }
    Pour info quand je ne met pas le delegate l'application est bien entendu bloqué quand je le met l'interface est libre donc cela fonctionne bien.
    Quand j'utilise ce code en application console je recois bien les informations désirées, mais la je ne recois rien.

    Merci par avance de vos conseils.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut el_filosof,

    il doit surement me manquer des elements de ton projet, mais dans le code presenté, tu endors un thread indefiniment, il est "perdu", autant enlever le Sleep et tout ce qui suit, il ne sera jamais declenché (du moins à ce que j'en vois), et le thread utilisé dans le begin invoke se terminera tranquillement. Pour l'event, il faudrait voir du coté du lanceur de l'event à proprement parler. Bref, il faudrait un peu plus de code, s'il te plait, surtout pour voir ce qu'est et ce que fait watcher. =)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 43
    Points : 41
    Points
    41
    Par défaut
    Bonjour SirJulio et Merci pour ta réponse.

    En effet j'ai enlever le sleep et cela fonctionne mais seulement quand je lance l'executable...

    Par contre quand je lance a partir du compilateur il ne se passe rien...

    Autre probleme au bout d'un moment le programme se met a ne plus fonctionner du tout obliger de reboot le pc pour qu'il fonctionne a nouveau..

    voici tout mon code pour plus de précision:
    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Management;
    using System.Diagnostics;
    using System.Threading;
     
    namespace repere
    {
        public partial class Form1 : Form
        {
            public ManagementEventWatcher watcher;
     
            public Form1()
            {
                InitializeComponent();            
            }
     
            public void HandleEvent(object sender, EventArrivedEventArgs e)
            {
                richTextBox1.Text += ("\n----------------------------------------------------\n");
                String allthread = "Tous les threads: ";
                try
                {
                    Process[] allProcs = Process.GetProcesses();
     
                    foreach (Process proc in allProcs)
                    {
                        ProcessThreadCollection myThreads = proc.Threads;
                        if (proc.Id.ToString() == e.NewEvent["ProcessID"].ToString())
                        {
                            richTextBox1.Text += ("Nom PROCESS: " + proc.ProcessName.ToString() + "\n");
                            foreach (ProcessThread pt in myThreads)
                            {
                               allthread += ( pt.Id + " | ");
                            }
                        }
                    }
                    richTextBox1.Text += (allthread + "\n");
                }
                catch (ManagementException err)
                {
                    Console.WriteLine("erreur: " + err.Message+"\n");
                }
     
            }
            public delegate void delegatethstart(String id_proc);
     
            public void thstart(String id_proc)
            {
                try
                {
                    WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_ThreadStartTrace where ProcessID="+id_proc);
                    watcher = new ManagementEventWatcher(query);                
                     watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
                    watcher.Start();
                }
                catch (ManagementException err)
                {
                    richTextBox1.Text += ("Erreur: " + err.Message);
                }
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                delegatethstart dele_thread = new delegatethstart(thstart);
                IAsyncResult iAr;
                iAr = dele_thread.BeginInvoke(textBox1.Text,null, null);
                richTextBox1.Text += ("En attente du processus..." + textBox1.Text);
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                watcher.Stop(); 
            }
     
        }
    }

Discussions similaires

  1. problème avec mes constantes
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 10/05/2006, 18h37
  2. [JDBC]problème avec mes id
    Par Hydre dans le forum JDBC
    Réponses: 12
    Dernier message: 29/09/2005, 14h19
  3. Réponses: 5
    Dernier message: 10/05/2005, 11h22
  4. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 12h56
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 16h16

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