none
Une form dans une thread independante RRS feed

  • Question


  • Bonjour a tous,
    je débute en .net et C# alors excusez moi si mes questions vous semblent trivial.

    Je veux creer une form dans une thread independante pour des question de performance mais je veux pouvoir mettre à jour la textBox de la form quand et avec le texte que la thread principale souhaite.

    Comment je fais ?

    Merci de votre aide.
    jeudi 31 juillet 2008 09:43

Réponses

Toutes les réponses

  • Bonjour,

      En gros tu as 2 forms, une principale et une secondaire...

      Le plus simple a mon sens :

    - dans la principale : déclare une référence vers l'autre form

    -> private maFormSecondaire maForm;

    - j'imagine que tu ouvres cette seconde form dans un bouton ou au chargement du principale :

    -> maForm = new maFormSecondaire();

    -> maForm.Show();

    - ensuite si tu veux que "maForm" puisse mettre a jour le form principale le mieux serait d'utiliser un événement :

    -> dans maFormSecondaire déclare un événement style "updateText"

    -> dans la principale, juste aprés le new :

    maForm.updateText += new event.....(maFonction);

    et ensuite la fonction " maFonction(string newText) { textbox.Text = newText; } "

      Voila comment je vois la chose en gros...

      Si tu connais pas trop les événements je peux te faire un petit projet simple pour montrer comment faire, y'a qu'a demander Smile

     

      A+,

             Stéphane

     

    jeudi 31 juillet 2008 10:14
  • Dépendant de tes besoins, tu peux toujours utilisé le BackgroundWorker pour faire des tâches en arrière-plan avec des mises à jour à ta form pour afficher la progression/les résultats.
    jeudi 31 juillet 2008 11:07
    Modérateur
  • Merci pour vos reponses.

     

    Mes besoin sont legerement differents.

     

    je ne peux, me semble t il pas utiliser le BackgroundWorker puisque c'est la forme elle meme qui doit etre embarqué dans une nouvelle thread.

     

    La classe qui veut ecrire dans la form ne peut (pour des raisons de design objet) deriver de form.

    Tout le system de repaint et d'evenements de la form doit etre embarqué dans le nouveau thread (pour des question de performance).

     

    Je ne peux pas non plus creer la form dans la classe qui veut ecrire dedans puisque les form sont non thread safe et aussi que cela embarquera la boucle d'evenement de la form dans le thread d'origine.

     

    Je tente un petit schemas :

    Ma classe_qui_veut_afficher_dans_form-->fork_une_new_Thread -->Creé_ma_forme                

               |                                                                                             |

               |____>_____>___(Ecris_dans_une_TextBox_de la forme___>___|

     

    J'espere que c'est a peu pres clair.

     

     

    Merci

     

     

     

     

    jeudi 31 juillet 2008 11:49
  • Re Wink

      J'avous ne pas tout comprendre de ce que tu dis sur les notions de boucle d'événements de form (si un form crée un autre form et l'affiche en ".Show()" je ne pense pas que les "event paint" soit partagé mais je m'y connais pas assez dans ce type de chose)

      Quoiqu'il en soit our faire un Thread a part regarde du coté des System.Threading.Thread Wink tu as même un ParametizedStart. Aprés il te faudra forcément t'abonner a un event du thread en question ou passer au thread un paramètre (genre l'object TextBox a mettre a jour mais je ne sais pas si ca marcherai)

      Je suis entrain de faire un ptit test pour voir mais le mieux a mon avis c'est de faire une tite classe qui charge le form et renvoi un événement pour dire "y'a du texte a changer", aprés le Thread c'est un appel a une méthode Run de cette classe (tu peux faire un singleton par exemple...)

      C'est juste des idées en vrac hein Wink

     

      En espérant t'aider un peu,

             Stéphane

    jeudi 31 juillet 2008 12:43
  • Juste par curiosité :

    http://cid-27dd9ae14446d884.skydrive.live.com/self.aspx/Public/Dev/WinFormsAndThreads.zip

     

    J'ai fais a la va vite j'espére que tu trouveras des bouts de codes qui t'aiderons (je pense que c'est pas exactement ce que tu recherches mais ca doit pas être loin !)

     

    Si tu as des questions sur des trucs que tu captes pas (vu que j'ai pas trop commenté lol) hésites pas !

     

    ++

       Stéphane

     

    jeudi 31 juillet 2008 13:05
  • Merci beaucoup !!!

     

    En utilisant le systeme par new Thread et events et en inversant le chainage des events et des handle La form2 se met a jour quand on clique sur la form 1 sur un nouveau bouton.

     

    Vraiment merci !

     

    Une question pourquoi fait tu une tel consommation de "static" allant meme jusqu' a declarer une instance static d'une instance de la classe en cours (form2Launcher).

    Peut tu me dire l'interet d'une telle pratique ?

     

    Merci beaucoup !!!

    vendredi 1 août 2008 09:12
  • Bonjour,

      Ah oui j'aime bien les instances static...

      Si tu regardes le codes au niveau de l'utilisation de la classe form2Launcher ca permet de pouvoir appeller les membres en static (form2Launcher.Run par exemple) sans pour autant se faire un "new". Tu auras toujours (aprés le premier appel) une instance en mémoire et préte à répondre. C'est clair que dans l'exemple c'est un peu "lourd" mais ca permet de ne pas s'embéter quand tu lances le thread tu dois lui donner une fonction a executer :

    - en "normal" :

    1. tu déclares ton object form2Launcher frm = new ...

    2. tu passes en paramètre au constructeur du thread "frm.Run"

    3. tu dois faire attention que frm soit bien en mémoire et c'est la que ca deviens un peu marrant : en faisant comme ca frm sera chargé en tant que membre du form ou tu a fais le new, alors qu'avec le singleton en static :

    - en "static" :

    1. tu passes le form2Launcher.Run au constructeur du thread

    2. la le .net va donc passer par l'instance static, et charger ton objet form2Launcher (_instance) en mémoire. Tu n'as pas trop a te poser de question sur "dans quel mémoire l'objet est ?". Ceci permet aussi de pouvoir décharger le form qui a fait le thread sans perdre l'objet! pratique par exemple si tu veux récupérer des données de form2Launcher plus tard (on pourrais par exemple lui faire stocker le dernier texte recu et n'importe ou dans le projet faire un "form2Launcher.DernierTexte".

      Ok dans ce projet c'est surement un peu superflue mais j'ai pris des bouts de projets que j'ai ici donc voila Wink

      Si quelqu'un a des commentaires sur ces singletons j'avous que je ne connais pas bien bien les contraintes en termes de mémoire, perf, ... c'est bien ou pas de faire ce genre de code ?

      ++,

           Stéphane

     

    vendredi 1 août 2008 09:27
  • Je te pique le patern de ce singleton ! ;-)

     

    Merci

     

    mardi 5 août 2008 08:09
  • BackgroundWorker + Thread + événement + static
    = confiture + miel + nutella + beurre de cacahuette

     

    un objet BackgroundWorker suffit pour faire tout ceci

     

    la classe Thread est décrite comme obsolète et remplacée par BackgroundWorker

     

    si la conception est correcte, on doit pouvoir afficher autant de fenêtres secondaires qu'on veut, tournant chacune dans son thread - static = code non objet (language C, guitare sèche, plein emploi)

     

    remarques concernant BackgroundThread :
    - bug : l'identifiant de tâche reçu par le gestionnaire de l'événement RunWorkerCompleted dans la propriété UserState d'un de ses arguments vaut toujours null - de ce fait, si on lance plusieurs tâches identiques et qu'on a besoin de les identifier, il faut ajouter un méchanisme supplémentaire
    - gestionnnaire d'événement RunWorkerCompleted : ne lire la valeur du champ Result d'un des argument que si le champ Error vaut null et le champ Cancel vaut false
    - en cas d'exception dans le second thread, si le programme est lancé au moyen du débogueur, l'exécution s'arrête au lieu d'arrêter le second thread

     

    enfin, pour revenir au début, comment espères-tu accélérer ton programme avec une seconde fenêtre et un second thread ?

     

    A+

    lundi 18 août 2008 13:02
  • Bonjour 6Trouille,

     

    Je n' ai pas dit "accelerer" mon programme mais augmenter ces "performances", ce n'est pas la meme choses ! ;-)))

    Mon programme doit etre capable de recevoir des données et de les traiter en meme temps et de logguer a l'ecran. Le log a l'ecran est particulierement lent ; en l'isolant dans une thread a part, la reception et le traitement continue afin que les clients n'attendent pas. Avec du multithreading j'augmente les services rendus au client donc les performances de mon programme.

    Malheureusement je ne peux pas (encore ? ;-)) overcloker le processeur du serveur avec le .net !!! ;-)))))

     

    Merci pour tes remarques sur BackgroundThread  et RunWorkerCompleted je vais me pencher dessus.

     

    A bientot

    vendredi 22 août 2008 06:55