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 :

Créer un Proccessus


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Créer un Proccessus
    Bonjour,

    Je voudrais exécuter une fonction sur différent processus afin d'en lancer une pendant qu'une autre est déjà en cours. Je sais qu'il faut utiliser des threads mais je ne sais comment faire.
    Voici ma fonction :
    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
     public void actionRealise(int type, object _text)
            {
                if (declencherStart == true)
                {
                    if (type == 4)
                    {
                        for (int i = 0; i < 100000000; i++)
                        {
                            Console.WriteLine("un message");
                        }
                        Setinfos(0, "plugin2 : fichier modifier");
                        Setinfos(5, _text + " " + validerF);
                    }
                }
            }
    j'ai regarde plusieurs tuto mais a chaque fois les méthodes étaient mises en static se qui m’empêchent d'utiliser certaine valeur.
    Merci d'avance !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser un Task<> ?

    Tatayo

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Bonjour,
    Je ne connais pas cette fonction mais je vais me renseigner.
    Je reviens vers vous si j'ai un problème !
    Merci de votre aide !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Pourquoi ne pas utiliser un Task<> ?
    Bonjour,
    J'ai essayé de suivre un tuto mais même j'ai les erreurs suivants :
    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
     
            Task task = new Task( () => { actionRealise(); } );
     
            task.Start();
     
     
            public void actionRealise(int type, object _text)
            {
                if (declencherStart == true)
                {
                    if (type == 4)
                    {
                        for (int i = 0; i < 100000000; i++)
                        {
                            Console.WriteLine("un message");
                        }
                        Setinfos(0, "plugin2 : fichier modifier");
                        Setinfos(5, _text + " " + validerF);
                    }
                }
            }

    aucune surcharge ne prends 0 argument ---> comment faire pour lui en donner puisque je les recoit en faisant actionRealise()
    Plugin2.Plugin2.task' est un 'champ' mais est utilisé comme un 'type' ---> est ce que le task se lancera automatiquement quand mon Form principal appelera la méthode ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Je ne comprends pas bien le problème.
    actionRealise attend 2 paramètres obligatoires, donc quel que soit la méthode d'appel, il faut bien renseigner les deux paramètres.
    Là dans ton code tu appelles la méthode sans aucun paramètres. Donc ça ne fonctionne pas.
    Tu peux jeter un œil à cette page, un exemple vers la fin explique bien le fonctionnement.

    Tatayo.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    actionRealise attend 2 paramètres obligatoires




    Justement, c'est mon main qui me donne ces 2 paramètre que je ne peux connaitre dans cette class , donc comment faire ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par tatayo Voir le message
    actionRealise attend 2 paramètres obligatoires
    Tatayo.

    Bonjour,
    J'ai essayé avec Task en faisant de cette manière mais cela ne fonctionne pas puisque cela exécute toujours la task jusque au bout avant d'en relancer une autre !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Task task = Task.Run(() => { _Plugins[tabControl1.TabPages[i].Text].actionRealise(type, _text); });
                        task.Wait();
                        MessageBox.Show(Convert.ToString(task.Status));

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Bonjour,
    Le fonctionnement décrit est tout à fait normal. Tu lances une tâche (task.run), puis tu attends la fin (task.wait).

    Si tu ne veux pas attendre la fin d'une tâche, enlèves le task.wait().

    Tatayo.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Nom : Capture.PNG
Affichages : 146
Taille : 11,9 Ko
    avec le wait
    Citation Envoyé par tatayo Voir le message

    Si tu ne veux pas attendre la fin d'une tâche, enlèves le task.wait().

    Tatayo.
    Mais alors dans ce cas la, mon actionRealise ne se fait jamais, ce que je ne comprends pas, et il ne m'affiche pas la ligne avec plugin 2 ...
    Nom : Capture.PNG
Affichages : 142
Taille : 6,9 Ko
    sans le wait

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Je pense que tu n'as pas bien saisi le principe des Task<>.
    Sans le task.wait, tu n'attends pas la fin de la tâche.
    Mais si tu ne récupères jamais le résultat, forcément tu as l'impression qu'il ne se passe rien.

    Si tu mets un Console.write("Quelquechose") dans ActionRealisee(), tu verras que la méthode est bien appelée.

    Je peux tu donner un exemple concret: je suis en train de faire un programme qui importe des commandes depuis un site Magento.
    Dans cet import je dois (entre autre) vérifier la disponibilité des produits via un WebService. Pour accélérer un peu les choses je lance cette vérification "en arrière plan".
    J'ai donc ceci:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    … un peu de code …
    Task<WS_Magento.CheckAvailabilityResponse> availabilityTask =  magento.CheckAvailabilityAsync(dispo, "", "", false, "");
    … pas mal de code …
    availabilityTask.Wait();
    WS_Magento.CheckAvailabilityResponse availability = availabilityTask.Result;
    … encore du code …
    Ainsi pendant que l'appel se fait, je peux avancer sur d'autres traitement de la commande (dans le "pas mal de code").

    Je ne connais pas l'architecture de ton programme, mais soit tu dois attendre à un moment ou l'autre la fin des tâches pour récupérer les valeurs, soit le thread principal doit attendre quelque part la fin de ces tâches (via un wait()), soit les tâches doivent "informer" le thread principal qu'il y a quelque chose à récupérer. Peut-être avec un délégué (à tester) ?

    Tatayo.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par tatayo Voir le message

    Je ne connais pas l'architecture de ton programme, mais soit tu dois attendre à un moment ou l'autre la fin des tâches pour récupérer les valeurs, soit le thread principal doit attendre quelque part la fin de ces tâches (via un wait()), soit les tâches doivent "informer" le thread principal qu'il y a quelque chose à récupérer. Peut-être avec un délégué (à tester) ?

    Tatayo.
    Voici mon code :
    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
     public void actionRealise(int type, object _text)
            {
                if (declencherStart == true)
                {
                    if (type == 4)
                    {
                        for (int i = 0; i < 100000000; i++)
                        {
                            Console.WriteLine("un message");
                        }
                        Setinfos(0, "plugin2 : fichier modifier");
                        Setinfos(5, _text + " " + validerF);
                    }
                }
            }
    La façon dont je l'appelle :
    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
     
    public void SetInfos(int type, string _text)
            {
                if (type == 0)
                {
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectionColor = Color.Green; }));
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectedText += _text + "\n"; }));
                }
                else if (type == 1)
                {
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectionColor = Color.Red; }));
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectedText += _Plugins[tabControl1.SelectedTab.Text].Name() + " : " + _text + "\n"; }));
                }
                else if (type == 2)
                {
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectionColor = Color.Yellow; }));
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectedText += _Plugins[tabControl1.SelectedTab.Text].Name() + " : " + _text + "\n\n"; }));
                }
                else if (type == 3)
                {
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectionColor = Color.Black; }));
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectedText += _text + "\n\n"; }));
                }
                else
                {
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectionColor = Color.Black; }));
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.SelectedText += _text + "\n\n"; }));
                    for (int i = 0; i < _Plugins.Count; i++)
                    {
                        Task tas = Task.Run(() => { _Plugins[tabControl1.TabPages[i].Text].actionRealise(type, _text); });
                    }
                }
     
            }
    Ce que je ne comprends pas c'est pourquoi sur la 2eme image l’événement ne se déclenche pas.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    De mon côté ce que je ne comprends pas, c'est que ActionRealise appelle setInfos (lignes 11 et 12), et que setInfos appelle ActionRealise (ligne 30).
    Il n'y a pas comme un truc qui cloche ?

    Tatayo.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par tatayo Voir le message
    ActionRealise appelle setInfos (lignes 11 et 12), et que setInfos appelle ActionRealise (ligne 30)
    Non car setInfos est un événement, qui retourne donc un int et un string. Ensuite, pour tous mes plugin je vais renvoyer action réalise avec le dernier set infos. Si le int correspond avec le plugin alors cela fait le 2eme code qui renvoi donc un nouveau setInfos avec un nouveau int qui "matchera" avec un autre plugin.


    J'ai finalement trouvé ma solution :

    Dans ma méthode il suffisait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public async Task actionRealise(int type, object _text)
            {
                if (declencherStart == true)
                {
                    if (type == 4)
                    {
                        await Task.Delay(7000);
                        Setinfos(0, "plugin2 : fichier modifier");
                        Setinfos(5, _text + " " + validerF);
                    }
                }
            }
    Merci de votre aide !

Discussions similaires

  1. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22
  2. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10
  3. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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