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 :

probleme de processus unique


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut probleme de processus unique
    slt!
    Je développe en Visual C#2008 et j'ai u problème.
    J'ai un fichier nommé code.txt que je veux lancer dans mon application comme processus au click sur un bouton button1.
    Je veux au fait que si le fichier est déjà en cours d'utilisation, que le messagebox s'afficher, sinon, qu'il se lance normalement.
    J'ai essayé
    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
     
    private void button1_Click(object sender, EventArgs e)
            {
                Process pcur = Process.GetCurrentProcess();
                Process[] pr = Process.GetProcesses();
                foreach(Process p in pr)
                {
                    if (pcur.Id != p.Id)
                    {
                        if (pcur.ProcessName == p.ProcessName)
                             Process.Start("code.txt");
                    }
                    else
                    {
                        MessageBox.Show("processus deja en cours", "Attention", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            }
    Mais il ne me répond pas convenablement,même si le processus n'est pas lancé, il ne fait qu'afficher le messagebox à tout moment.
    J'ai lu le msdn et lafaq du site, mais ces derniers ne parlent que de comment ne pas lancer l'application courante deux fois, alors que moi je veus empêcher que dans l'application, un processus soit lancé deux fois.
    J'ai modifié la condition comme ceci:
    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
     
    private void button1_Click(object sender, EventArgs e)
            {
                Process pcur = Process.GetCurrentProcess();
                Process[] pr = Process.GetProcesses();
                foreach(Process p in pr)
                {
                    if (pcur.Id != p.Id)
                    {
                        if (pcur.ProcessName != p.ProcessName)
                                MessageBox.Show("processus deja en cours", "Attention", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     
                    }
                    else
                    {
                        Process.Start("code.txt");
                    }
                }
            }
    Ici, il lance le processus mais le messageboxs'affiche autant de fois qu'il y a des processus.

    Merci

    TM018

  2. #2
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut
    Slt!
    Apparement ma question n'est pas claire, je veux illustrer autrement:
    Dans certaines appli, l'appui sur la touche F1 lance un fichier d'aide (.chm ou autre), mais il y a un m"canisme pour qu'il ne se lance pas deux fois.
    J'ai abordé ce problème en lancant le fichier texte comme processus, apparement c'est pas la bonne.
    Si quelqu'un est plus éclairé, qu'il m'aide.

    Merci

    TM018

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    à mon avis le mieux c'est de faire une variable privée dans ta classe
    sur le clic, si la variable is nothing alors tu fais un new process que tu start
    donc si on reclic ta variable n'est plus nothing et donc tu rouvres pas

    voir dans un 2ème temps si quelque chose te dis que le processus est arreté pour que tu détruises ta référence
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    On peut garder de côté un objet Process, il y a un événement très pratique associé au passage

    En très gros
    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
    Process p = null;
    ...
    private void LanceProcess()
    {
        if (p == null)
        {
            p = new Process();
            p.Exited += new EventHandler(process_Exited);
            p.StartInfo.FileName = "monFichier.txt";
            p.Start();
        }
    }
    ...
    private void process_Exited(object sender, EventArgs e)
    {
        Process p = sender as Process;
        p.Close();
        p = null;
    }

  5. #5
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut
    Slt!
    Merci pour le code, il a marché pour une partie de mes attentes, c'est à dire le processus ne se lance qu'une seule fois.
    Seulement, meme lorsque je ferme le fichier txt, je ne peux pas le relancer, d'ou je cherche comment détecter si un fichier (exe,txt) est ouvert pour ainsi empêcherde le lancer de nouveau.

    Merci

    TM018

  6. #6
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut
    Je suis pas clair ou dans ce forum personne n'a jamais écrit ce code?
    J'ai juste besoin d'une méthode pour détecter si un fichier est ouvert ou pas.

    Merci.

  7. #7
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    à mon avis le mieux c'est de faire une variable privée dans ta classe
    sur le clic, si la variable is nothing alors tu fais un new process que tu start
    donc si on reclic ta variable n'est plus nothing et donc tu rouvres pas

    voir dans un 2ème temps si quelque chose te dis que le processus est arreté pour que tu détruises ta référence
    Cette solution me semble bonne, mais aussi un peu savante.
    Connaissant le problème que je pose, veuillez m'aider plus clairement svp.

    Merci

    TM018

  8. #8
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut J'attends une solution claire!!!
    Slt!
    Ca fait plus d'un mois que j'ai posté ce message, j'attends une solution claire, svp...

    Merci

    TM018

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tout est là pourtant !

    une variable privée processus

    sur clic si processus est à null :
    - tu le démarres
    - tu le stock dans la variable privée
    - tu add un handler sur l'event exit


    sur l'event exit
    - tu retires le handler
    - tu remet la variable privée à null
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé Avatar de demando77
    Inscrit en
    Décembre 2007
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 263
    Par défaut
    Slt et merci!
    Je ne sais pas si tu veux parler du bout de code qui est dans cette discussion.
    Je l'ai esayé mais j'ai posté un message pour décrire sa limite.

    Je sais lancer le processus, créer l'event comme prescrit, mais le problème est qu'avec ca, lorsque je ferme le processus (fichier texte), je ne peux plus le relancer à partir du formulaire bien que le fichier soit déja fermé.
    Voilà pourquoi je dis qu'il me faut peut-être détecter si le fichier est ouvert (à la manière de windows si on veut supprimer un fichier en cours d'utilisation).
    C'est donc là le problème.

    Merci encore

    TM018

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    je ne pense pas qu'on puisse savoir si le fichier est dejà ouvert
    (voir qu'il a été modifié l'es par contre mais ca n'est pas utile ici)

    par contre je suis sûr du code que je t'ai mis donc t'as du oublié un bout ou mal compris

    sur ton bouton_click
    tu test si _p as processus is null, s'il n'est pas nothing, en effet tu n'ouvres pas le fichier (tu pourrais ptete meme passer le focux, connaissant le processus)
    par contre quand tu te prend l'event process exit, si tu remets p à null et que tu recliques sur le bouton, p étant null ca ouvre le fichier !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. probleme sur serveur uniquement.
    Par nico_4802 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 08/08/2007, 15h57
  2. probleme Violation of unique key constraint et SSIS
    Par housni dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 07/08/2007, 16h28
  3. probleme de processus
    Par pierrot2908 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 04/05/2007, 14h09
  4. [NetBeans] Probleme de Processus IDE(Gestion mémoire)
    Par sniperseb dans le forum NetBeans
    Réponses: 3
    Dernier message: 01/02/2006, 19h22
  5. [IMP/EXP] Probleme d'index unique
    Par rours dans le forum Oracle
    Réponses: 17
    Dernier message: 18/05/2005, 15h37

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