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 :

Executer le traitement dans un thread ou BackgroundWorker


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut Executer le traitement dans un thread ou BackgroundWorker
    Hello,
    j'ai fait des recherches sur google, forum, sur l'utilisation des threads et je n'arrive toujours pas a comprendre comment le mettre en oeuvre dans mon cas.
    j'explique, j'ai une form qui contient plusieurs textboxes.
    j'ai un bouton qui me permet de creer un .doc et ensuite converti ce .doc en PDF.
    Le probleme c'est que cette petite fonctionnalité fige quelques instant l'application complete.
    J'ai donc pensé a faire ce traitement dans un thread separé.
    (je suis tombé sur un post qui expliquais cela http://www.developpez.net/forums/d63...ultithreading/ mais je n'ai toujours pas compris.
    j'ai l'erreur suivante quand je tente de passer le traitement au thread:
    Opération inter-threads non valide: le contrôle 'frmLauncherBo' a fait l'objet d'un accès d'un thread autre que celui sur lequel il a été créé.
    Vous allez me dire ,
    il suffit de sortir tout le code qui touche de près ou de loin aux composants winform dans une fonction externe de d'y ajouter la vérification à l'aide de InvokeRequiered
    mais cela ne me parle pas vraiment.....
    tomlev a parlé de BackgroundWorker qu'est ce que cela est?
    Comment cmet on en oeuvre ce mechanisme.
    Merci de votre aide et de vos lumiere.

    un extrait de mon code ;
    j'ai declaré mon thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Thread _threadPDF;
    puis defini la methode StartThread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     private void StartThread()
            {
                // ThrFunc est la fonction exécutée par le thread.
                _threadPDF = new Thread(new ThreadStart(ExportToPDF));
                // Il est parfois pratique de nommer les threads surtout si on en créé plusieurs.
                _threadPDF.Name = "Thread1";
                // Démarrage du thread.
                _threadPDF.Start();
            }
    et la ou j'appel d'habitude ExportToPDF j'appel StartThread

  2. #2
    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 : 48
    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
    Regarde le tuto du composant BackgroundWorker, cela te suffira peut être.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut
    merci j'avais commencé a le lire, mais je ne comprends pas comment transposer son exemple dans mon cas.
    Dans le tuto il fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bgwDesign.RunWorkerAsync((int)nudNbLoop.Value);
    il passe en parametre le nbLoop.
    Moi dans mon cas je souhaite passer ....(je ne sais pas) puisque c'est une fonction ExportToPDF
    (je ne la met pas entiere elle est trop longue.
    Mais voici un extrait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PrintDocument prtdoc = new PrintDocument();
                DefPrinter = prtdoc.PrinterSettings.PrinterName;
    //creation d'un .doc a partir des champs de ma form
                CreateDoc(iTypeDoc, false);
    
                string fname, DefaultPrinter;
                string fi2 = string.Empty;
                PDFCreator.clsPDFCreatorOptions opt;
                pErr = new PDFCreator.clsPDFCreatorError();
    
                _PDFCreator = new PDFCreator.clsPDFCreator();
    ....
    As tu une idée de qu'est ce que je devrais mettre en parametre ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BGW_PDF.RunWorkerAsync(????);

  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 : 48
    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
    Tu passes en paramètre ce dont tu as besoin. Le nom du fichier .doc à imprimer en PDF par exemple.

    Mais tu n'es pas obligé de passer quelque chose en paramètre, les informations nécessaires peuvent être stockées dans des champs privés de la classe au besoin.

    Bref, à toi de voir les entrées nécessaires à ton traitement afin de déterminer les paramètres nécessaires.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut
    Desolé je ne suis pas sur de comprendre...
    Je souhaite passer au BGW tout le traitement, c'est a dire la creation du .doc ainsi que la convertion en PDf.
    tout cela se fait dans la fonction ExportToPDF.
    donc, je ne comprends pas trop comment lui passer cela

  6. #6
    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 : 48
    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
    Tu n'as pas à lui passer le traitement, tu n'as pas bien lu le tuto.

    Le BackgroundWorker fourni un événement DoWork et c'est dans la méthode associée à cet événement que tu dois faire ton traitement : appeler ExportToPDF avec le nom complet du fichier doc à convertir par exemple. Sachant que ce code sera exécuté dans un thread à part.

    Reprend le tuto, sans lire en diagonale ^^
    Tout ce qu'il te faut est là

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Architecture de mon algorithme: quand séparer un traitement dans un thread ?
    Par billybobbonnet dans le forum Windows Presentation Foundation
    Réponses: 42
    Dernier message: 17/10/2014, 15h59
  2. Réponses: 3
    Dernier message: 14/07/2010, 15h27
  3. Forcer l'execution d'une fonction dans un thread
    Par greg2 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 24/11/2009, 15h34
  4. Problème d'execution de code dans un thread
    Par [Silk] dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2006, 14h49
  5. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 11h34

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