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 :

Lancer plusieur thread sur la meme fonction


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 63
    Points : 28
    Points
    28
    Par défaut Lancer plusieur thread sur la meme fonction
    Bonjour ,je me suis recement mis aux threads pour cause de gele d'interface dans 2 programme distinct qui concerne le mailling et telechargement ftp.

    J'ai donc reussi a faire un thread avec passage de parametre en vb.net,bizarrement j'ai trouver la solution dans la faq asp.net.

    Enfin bref moi je voudrais puvoir lancer jusqua 20 thread sur ma fonction mailling,comment faire ? voici un exemple du code que j'utilise
    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
     
    Public Class ThreadParametre
    Private _text As String
     
     
    Public Sub New(ByVal texte As String)
    _text = texte
    End Sub
     
    Public Sub ExecuteThread()
    mon code d'envoi d'email ou mon code de telechargement de fichier ftp
    End Sub
    End Class 
     
     
     
    Public Class Exemple
     
    Public Shared Sub Main()
    Dim ExempleThread As ThreadParametre = New ThreadParametre(Adresse)
    Dim t As Thread = New Thread(New ThreadStart(addresOf ExempleThread.ExecuteThread))
    t.Start
    End Sub
     
    private sub envoiMail ()
     
    While not eof....
     
    J'appelle mon thread
    Main(Adresse)
     
    wend
    end sub
    voila si vous poouviez m'aider a lancer plusieur thread du meme programme ca serais gentil

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    ben il suffit de faire comme quand tu lances un seul thread, mais plusieurs fois... tu peux éventuellement mettre les threads créés dans une liste pour les garder sous la main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim threads As New List(Of Thread)
    Dim t As Thread
    Dim ExempleThread As ThreadParametre
    For Each address As String In addresses
        ThreadParametre = New ThreadParametre(Adresse)
        t = New Thread(New ThreadStart(addresOf ExempleThread.ExecuteThread))
        threads.Add(t)
        t.Start
    Next address

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 63
    Points : 28
    Points
    28
    Par défaut Re:treads
    Merci pour ta reponse,

    Je n'est pas essayer ta solution,mais je sens que mon appli vas vite geler si je trouve pas un moyen de limiter les threads,il me faudtrais donc un moyen de recupere le nombre de threads actifs pour pouvoir y mettre une condition a cette boucle,ou alors je mets un thread.sleep(300) dans mon appel en boucle pour eviter la debordage qu'en pensez vous?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    lu en diagonale

    une autre possibilité serais un thread de gestion des choses à faire (sur le thread d'ui)
    un thread de gestion des thread à démarrer (ce thread dans un while true pour qu'il continue toujours)
    une list(of thread)
    un queue(of chose à faire)


    si thread d'ui vois qqch à faire, il le rajoute dans queue

    si thread de démarrage des thread voit qqch dans la queue, il regarde si un des thread de la list est pas alive, au quel cas il crée un new thread et le range dans la list
    si tout le monde est alive (en train de marcher) ou que rien dans queue, alors thread.sleep (200) puis while end

    et donc tu te retrouves avec un nombre de thread limité et un thread qui s'occupe de démarrer ce nombre de thread dès qu'il y a de la place (et qqch à faire)

    je peux expliciter un peu plus si y faut
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    lu en diagonale

    une autre possibilité serais un thread de gestion des choses à faire (sur le thread d'ui)
    un thread de gestion des thread à démarrer (ce thread dans un while true pour qu'il continue toujours)
    une list(of thread)
    un queue(of chose à faire)


    si thread d'ui vois qqch à faire, il le rajoute dans queue

    si thread de démarrage des thread voit qqch dans la queue, il regarde si un des thread de la list est pas alive, au quel cas il crée un new thread et le range dans la list
    si tout le monde est alive (en train de marcher) ou que rien dans queue, alors thread.sleep (200) puis while end

    et donc tu te retrouves avec un nombre de thread limité et un thread qui s'occupe de démarrer ce nombre de thread dès qu'il y a de la place (et qqch à faire)

    je peux expliciter un peu plus si y faut
    c'est sans doute la meilleure méthode en effet, mais pas la peine de réinventer la roue: c'est exactement ce que fait la classe ThreadPool

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ah oui, connaissais pas ^^
    comme souvent en .NET y a une classe qui fait ce qu'on veut faire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 63
    Points : 28
    Points
    28
    Par défaut Re:thread
    Bonjour messieur et merci de vous preocuper de mon probleme

    Effectivement hier j'ai fait quelque tes et recherches et voila ce qui m'est apparu.

    Mon appel de thread ce fait dans une boucle et il appel une fonction de creation d'un nouveau thread,donc si j'envoie 2000 emails,il va me creer 2000 thread,il y a donc deja un probleme a ce niveau je pense.

    Donc pas la peine de faire une liste de thread,puisque elle et deja creer mais non controller.

    Si je ne met pas de thread.sleep,dans ma boucle d'appel ,j'ai un message d'erreur de memoire insuffisante qui apparait .

    EN faisant des recherche,je suis effectivement tomber sur threadpool,sur thread.join et thread.stat ou quelque chose comme ca.

    Ce qui me vient donc a l'espris par deduction logique,serais sois de creer le thread en dehors de mon appel de la fonction main et a ce momment creer un nombre defini de thread supplementaire, ou alors de laisser comme c'est est de gerer le nombre de thread actif grace a des commande tierce,le tout c'est de savoir comment on fait,ou on le fait,et que va t'il ce passer dans ma boucle lorsque je vais le faire.

    J'ai vu une documentation qui disais que la fonction sleep arreter net le thread la ou il était,alors que la fonction wait terminais le cycle en cours.

    Qu'en pensez vous et que me suggerer vous?

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    La réponse a été donnée supra : utiliser la classe ThreadPool.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    si j'envoie 2000 emails,il va me creer 2000 thread
    En même temps, tu n'as pas vraiment besoin d'envoyer tous ces emails en parallèle, si ? Un thread pourrait en envoyer plusieurs... En plus quand tu envoies un mail tu peux spécifier plusieurs destinataires, donc en fait il te suffirait d'envoyer le mail une seule fois...
    Enfin bref, si tu tiens à envoyer les mails séparément, il est clair que la meilleure solution est le ThreadPool. Tu peux définir le nombre max de threads à utiliser, et il gère une queue de toutes les actions à faire. Quand une action se termine, ça libère le thread utilisé, qui devient disponible pour traiter la prochaine action dans la queue, et ainsi de suite jusqu'à ce que toute la queue soit traitée...

Discussions similaires

  1. Plusieurs thread et une meme fonction
    Par azmimik dans le forum Général Python
    Réponses: 2
    Dernier message: 03/08/2007, 23h32
  2. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  3. debutant lecture de plusieur variable sur une meme ligne
    Par Slumpy dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/06/2006, 19h37
  4. Plusieurs jointures sur la meme table [complexe]
    Par Wells dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h41
  5. plusieurs sessions sur un même PC
    Par mouloudéen dans le forum Windows XP
    Réponses: 9
    Dernier message: 02/06/2006, 11h11

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