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

VB.NET Discussion :

fenetre mdi et threads


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut fenetre mdi et threads
    Bonjour,
    je développe une application en vb.net 2010 qui permet la lecture de 21 pointeuses. J'ai une fenetre mdi parent "mdiprincipal". A l'ouverture du "mdiPrincipal", 21 fenetre filles mdi s'ouvrent (ces fenetres sont des instances du fenetre "Form1"). Dans "MDIPrincipal", il y a un bouton "ToolStripBtnDemarreTout" qui permet la lecture des 21 pointeuses simultanément.
    Dans "Form1", j'ai fait une procédure pour la lecture des pointeuses "read_pointeuse()".
    Mon problème : lors du clic sur "ToolStripBtnDemarreTout", "MDIPrincipal" se plante et le temps d'exécution est très lent.
    J'ai lu plusieurs tutoriels sur les threads mais j'ai pas trouvé encore une solution.
    voici le code:
    Dans MDIPrincipal :
    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
     
    ' Declaration des instances de Form1
    Dim frmP1, frmP2, frmP3, frmP4, frmP5, frmP6, frmP7, frmP8, frmP9, frmP10, frmP11, _
            frmP12, frmP13, frmP14, frmP15, frmP16, frmP17, frmP18, frmP19, frmP20, frmP21 As New Form1
     
       Private Sub ToolStripBtnDemarreTout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripBtnDemarreTout.Click
            frmP1.pause = False   'pause : variable dans Form1
            DelegateReadP1.BeginInvoke(Nothing, Nothing)
            frmP2.pause = False
            DelegateReadP2.BeginInvoke(Nothing, Nothing)
            '................
            frmP21.pause = False
            DelegateReadP21.BeginInvoke(Nothing, Nothing)
        End Sub
     
    'Declaration
        Public Delegate Sub typeDelegateReadPointeuse()
        Public DelegateReadP1 As New typeDelegateReadPointeuse(AddressOf frmP1.read_pointeuse)
        Public DelegateReadP2 As New typeDelegateReadPointeuse(AddressOf frmP2.read_pointeuse)
        '.............
        Public DelegateReadP21 As New typeDelegateReadPointeuse(AddressOf frmP21.read_pointeuse)
    Dans Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub read_pointeuse()
         ' l'execution de ce code est tres lente 
         ' connexion aux pointeuses et lecture 
         ' il y a acces aux objets de l'interface du "Form1" 
         ' exemple: 
          LblEtat.Text = "Err.Lecture"
     
        End Sub
    Merci.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut thread,delegate,mise à jour UI
    Bonjour
    pour la maj de l'UI qui n'est pas traite par le BackGroundWorker regarde ce post http://www.developpez.net/forums/d10...thread/http://
    bon code.......

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Bonjour,
    J'ai utilisé backgroundworker mais il m'affiche ce message :
    The CLR has been unable to transition from COM context 0x1b7b48 to COM context 0x1b7cb8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.
    Je sais que mon programme lit 21 pointeuses en même temps. J'ai essayé de lire une seule mais le temps d'exécution est encore très long au niveau de ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CZKEM1.ReadGeneralLogData(vMachineNumber) Then
    Je crois que cette instruction permet de mettre tous les enregistrements de la pointeuse en mémoire, donc avez vous des solutions pour diminuer la charge sur la mémoire.
    Merci.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Bonjour,
    J'ai fait une modification sur mon code:
    Dans MDIPrincipal:
    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
        Dim frmP1, frmP2, frmP3, frmP4, frmP5, frmP6, frmP7, frmP8, frmP9, frmP10, frmP11, _
            frmP12, frmP13, frmP14, frmP15, frmP16, frmP17, frmP18, frmP19, frmP20, frmP21 As New Form1
         Private Sub MDIPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            frmP1.Show()
            '...........
            frmP21.Show()
            Me.LayoutMdi(MdiLayout.TileHorizontal)
        End Sub
     
        Private Sub ToolStripBtnDemarreTout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripBtnDemarreTout.Click
           frmP1.pause = False
            ' ............
            frmP21.pause = False
     
            frmP1.BGWorker.RunWorkerAsync()
            ' ..........
            frmP21.BGWorker.RunWorkerAsync()
        End Sub
    Dans Form1 (MDIFille):
    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 Sub read_pointeuse()
                    If CZKEM1.Connect_Net(myip, 4370) Then
                        If CZKEM1.ReadGeneralLogData(r_point) Then
                            While CZKEM1.GetGeneralLogDataStr(r_point, dwEnrollNumber, dwVerifyMode, dwInOutMode, timeStr)
                                Application.DoEvents()
                                'code
                                Console.WriteLine(r_point & " ... " & dwEnrollNumber & " ... " & dwVerifyMode & " ... " & dwInOutMode & " ... " & date1)
                            End While
                        End If
                    End If
        End Sub
     
        Private Sub BGWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWorker.DoWork
            read_pointeuse()
        End Sub
    ça marche bien mais se plante au niveau de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        If CZKEM1.ReadGeneralLogData(r_point) Then
    et je ne peux pas donc accéder à ma fenetre mdiPrincipal que lors de l'affichage (Apres plusieurs minutes):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Console.WriteLine(r_point & " ... " & dwEnrollNumber & " ... " & dwVerifyMode & " ... " & dwInOutMode & " ... " & date1)

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    ce n'est pas évident de t'aider avec ce code qui ne montre rien

    depuis le dowork tu ne peux pas accéder aux controles

    utilises tu des dll non .net ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Bonjour,
    J'ai modifié le code pour être plus clair.
    Oui j'utilise des .dll autre que .net (pointeuse). Pour résoudre le probleme de plantage j'ai utilisé les threads d'arrière plan comme j'ai montré.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    et tu as encore des problèmes ?

    utilises tu des activeX ?

    DoEvents n'a rien à faire dans un thread, le console.writeline je ne sais pas s'il est accepté dans un thread ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut 21 taches,pool thread,acces à l'UIui
    Bonjour moncef
    De toute maniere si tu utilise un monoprocesseur je remarque que tu es deja proche de la limite du nbre de threads par cpu qui est de 25.(25-21+1)=3
    Net Framework garde toujours un nombre minimun de threads en reserve sur les 25 pour parer à d'autres taches.
    Ceci fait que tu es tangent à la sutaration.
    Aussi
    1/ eliminer illico l'acces à l'UI(vire ces console.writeline dans read_pointeuse c'est inadmissible).
    2/ je suggere :
    -d'utiliser un "pool"(queue de threads) ce qui permet au systeme de les mettre en queue pour ne pas avoir un "etranglement".
    -met à jour l'UI immediatement des qu'un thread est termine grace à une classe de synchronisation.
    -n'interfere pas avec l'UI grace à une classe qui stocke l'etat de chaque tache.

    voici un exemple de l'api System.Threading.ThreadPool que tu peux adapter facilement en vb.net
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    'Projet Winform pour le ThreadPool
    Public Class frmMDIPoolThread
        'à virer
        'Dim frmP1, frmP2, frmP3, frmP4, frmP5, frmP6, frmP7, frmP8, frmP9, frmP10, frmP11, _
        '   frmP12, frmP13, frmP14, frmP15, frmP16, frmP17, frmP18, frmP19, frmP20, frmP21 As New frmMDIPoolThread
        'Instance d'une forme sur les 21 
        Dim mdiEnfantForm As Form
        'Tableau pour les 21 formes
        Dim tableauForm() As Form
        'Classe associe à l'etat de chaque tache
        Dim EtatPT As pointeuseEtat
        'Tableau pour les 21 instances de la classe pointeuseEtat
        Dim tableEtatTache() As pointeuseEtat
        'Classe de Synchronisation qui sert à un thread pour informer 
        ' qu'il est termine
        Private Shared AsyncOperationTermine As New  _
          System.Threading.AutoResetEvent(False)
        'Nbre de taches
        Dim nbTache As Integer = 21
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            '--------------Cree les 21 forms avec un controle Label------------
            ReDim tableauForm(nbTache - 1)
            For I As Integer = 0 To nbTache - 1
                mdiEnfantForm = New Form
                mdiEnfantForm.MdiParent = Me
                Dim objLabel As New Label
                objLabel.Name = "Label1"
                objLabel.Text = ""
                objLabel.AutoSize = False
                objLabel.Size = New Size(100, 100)
                objLabel.Location = New Point(50, 50)
                objLabel.BackColor = Color.LightSkyBlue
                'ajoute le label à form
                mdiEnfantForm.Controls.Add(objLabel)
                tableauForm(I) = mdiEnfantForm
                mdiEnfantForm.Name = "frmP" & (I + 1).ToString
                mdiEnfantForm.Text = mdiEnfantForm.Name & " ->" & " Thread " & (I + 1).ToString
     
            Next
        End Sub
        Private Sub frmMDIPoolThread_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Affiche les 21 forms
            For I As Integer = 0 To nbTache - 1
                tableauForm(I).Show()
            Next
            Me.LayoutMdi(MdiLayout.TileHorizontal)
        End Sub
        Private Sub MosaiqueHorizontaleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MosaiqueHorizontaleToolStripMenuItem.Click
            Me.LayoutMdi(MdiLayout.TileHorizontal)
        End Sub
        Private Sub BtnDemarreToutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDemarreToutToolStripMenuItem.Click
            'frmP1.pause = False
            '' ..........
            'frmP21.pause = False
            'frmP1.BGWorker.RunWorkerAsync()
            '' ..........
            'frmP21.BGWorker.RunWorkerAsync()
            'appele sub de demarrage du pool de Taches
            Call demarreTaches()
     
        End Sub
        'Sub charge du Demarrage des 21 threads dans un Pool
        Private Sub demarreTaches()
            ReDim tableEtatTache(nbTache - 1)
            'Met en Queue chaque tache
            For I As Integer = 0 To nbTache - 1
                EtatPT = New pointeuseEtat
                EtatPT.r_point = I + 1
                EtatPT.StrNumThread = "Thread" & (I + 1).ToString
                EtatPT.RetVal = ""
                tableEtatTache(I) = EtatPT
     
                Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback _
                                       (AddressOf read_pointeuse), EtatPT)
     
                'WaitOne =methode appele lorsque ce thread à termine.
                'execute lorsqu'un thread a appele AsyncOperationTermine.Set()) 
                'Afficher un message -immediatement- dans le controle Label de la forme concernee
                AsyncOperationTermine.WaitOne()
                'Acceder à l'UI par Classe pointeuseEtat
                MsgBox(EtatPT.StrNumThread & " est termine....")
                mdiEnfantForm = tableauForm(I)
                mdiEnfantForm.Controls(0).Text = EtatPT.RetVal
            Next
        End Sub
        'Sub "read pointeuese" modifie pour gerer les informations sur l'etat de chaque tache
        Public Sub read_pointeuse(ByVal objEtat)
            'If CZKEM1.Connect_Net(myip, 4370) Then
            '    If CZKEM1.ReadGeneralLogData(r_point) Then
            '        While CZKEM1.GetGeneralLogDataStr(r_point, dwEnrollNumber, dwVerifyMode, dwInOutMode, timeStr)
            '----------virer ci-dessous-----------
            'Application.DoEvents()
            ' Console.WriteLine(r_point & " ... " & dwEnrollNumber '& " ... " & dwVerifyMode & " ... " & dwInOutMode & " ... " & date1)                 'remplacant
            '       End While
            '    End If
            'End If
     
            Dim Cond1 As Boolean = True
            Dim Cond2 As Boolean = True
            Dim Limit As Integer = 1000
            Dim J As Integer = 1
            If Cond1 Then
                If Cond2 Then
                    Do While J < Limit
                        J = J + 1
                    Loop
                End If
            End If
            objEtat.RetVal = "Tache terminee : " & J.ToString & " ... " & Date.Now
            ' Signale que ce thread est termine au pool.
            AsyncOperationTermine.Set()
     
        End Sub
    End Class
    'Classe information sur Tache => 
    'stocke les informations sur l'etat de chaque tache "readpointeuse()" 
    Public Class pointeuseEtat
        Public r_point As Integer
        Public StrNumThread As String
        Public RetVal As String
        Public Sub New()
        End Sub
    End Class
    bon code..........

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    De toute maniere si tu utilise un monoprocesseur je remarque que tu es deja proche de la limite du nbre de threads par cpu qui est de 25
    et d'où tu sors cette idée étrange ??
    il n'y a pas de limite du nombre de threads dans une application ... enfin il y en a surement une comme pour tout mais c'est plusieurs centaines ou milliers minimum
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    DoEvents n'a rien à faire dans un thread, le console.writeline je ne sais pas s'il est accepté dans un thread ...
    console.writeline ça marche dans un thread et je l'utilise sauf pour le test.
    voici un exemple de l'api System.Threading.ThreadPool que tu peux adapter facilement en vb.net
    Le code semble un peu compliqué mais je vais le tester.
    Merci.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Merci MABROUKI,
    J'ai testé ton code, ça marche mais dans mon cas je dois attendre ~35 minutes pour qu'il termine la lecture des 21 pointeuses l'une apres l'autre, hors je dois lire les pointeuses chaque minute (ou quelques minutes).
    Le seul problème pour mon programme était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CZKEM1.ReadGeneralLogData(vMachineNumber) Then
    par contre il ne plante pas dans l'affichage (je peux accéder aux fenetres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(r_point & " ... " & dwEnrollNumber & " ... " & dwVerifyMode & " ... " & dwInOutMode & " ... " & date1)
    ou autre instructions comme une boucle for ou while normales.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    bonjour,
    J'ai opté de lire les pointeuse à partir d'une fenetre mdi parente, qui contient 21 mdi fille pour l'ergonomie, j'avais une solution de lire chaque pointeuse dans une fenetre à part mais ce n'est pas pro,.
    Donc SVP avez-vous une solution pour que je puisse afficher ces 21 fenetres filles sous une fenetre mdi parente mais comme si elles sont séparé.
    J'espère que vous m'avez compris.
    Merci.

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    pourquoi tu as besoin d'une fenetre par pointeuse ???
    parce que l'acquisition de données n'a rien à voir avec l'affichage qu'on en fait ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Je pense que c'est le même cas.

  16. #16
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut nb thread par cpu dans un pool
    bonjour pol
    Cette idee "etrange" de nombre de thread par "cpu" et non pas par application dans un pool ,je l'ai eu a partir de msdn lib ,que je te suggere de bien lire....chapitre des Pools....
    bonne soiree........

  17. #17
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour pol
    Cette idee "etrange" de nombre de thread par "cpu" et non pas par application dans un pool ,je l'ai eu a partir de msdn lib ,que je te suggere de bien lire....chapitre des Pools....
    bonne soiree........
    si tu veux dire qu'un processeur peut gérer x threads simultanément je veux bien croire
    mais ca n'empêche pas que si on fait des threads qui ne bossent pas 100% du temps on peut très bien monter au dessus de cette limite, comme certaines applis qu'on voit avec des centaines de threads ouverts à un instant T
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    MSDN Lib:
    Nombre maximal de threads de pool de threads

    Le nombre des opérations qui peuvent être mises en file d'attente dans le pool de threads est limité uniquement par la mémoire disponible ; toutefois, le pool de threads limite le nombre de threads simultanément actifs dans le processus. Par défaut, la limite est fixée à 250 threads de travail par unité centrale et à 1 000 threads de terminaison d'E/S.

  19. #19
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut nombre de thread par pool et par processus
    bonjour moncef
    ce que j'ai dit à propos du nombre de thread a ete apparement mal interprete.
    je voulais dire simplement qu'il faut faire la part des choses dans ce qu'il y dans MSDN Lib:

    1/ nombre de threads -par defaut- dans un pool et -par processus(=application) est de 25 .
    -si l'on fait un peu d'arithmetique et que mettons on lance 10 application avec chacune 1 pool on a reserve aupres du systeme d'exploitation 10x25=250 threads de travail.
    -si l'on fait un peu d'arithmetique et que mettons on lance 5 application avec chacune 2 pool on a reserve aupres du systeme d'exploitation 5x25x2=250 threads de travail.
    2/le nombre de threads de travail maximal par processor(250) que tu cites est etrangement un multiple du nombre 25.
    Ce 250 signifie que le systeme controle constamment en faisant l'arithmetique cite ci-dessus pour ne pas depasser ce nombre.
    Autrement si l'on depasse la barriere ,il met -heureusement- le delta thread dans les threads inactifs.
    3/Certainement qu'on peut reserver mettons jusqu'a 10 0000 threads ,mais cela ne servirait strictement rien puisque le system mettrait 10000-250 en attente c.à.d dans les threads inactifs.

    4/d'ailleurs l'api nous autorise à le faire avec méthode SetMaxThreads mais recommande le chiffre par defaut 25.

    pour terminer je donne l'integralite du paragraphe d'ou j'ai tire ce que j'ai avance :
    MSDN Lib:
    Il existe un pool de threads par processus. Le pool de threads a une taille par défaut de 25 threads de travail par processeur disponible, et de 1000 threads d'achèvement d'E/S. Vous pouvez modifier le nombre de threads dans le pool à l'aide de la méthode SetMaxThreads. Chaque thread utilise la taille de pile et l'ordre de priorité d'exécution par défaut.

    il faut me semble -t-il faire un bon usage de l' arithmeique.............
    bon code......

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

Discussions similaires

  1. [c#][VS 2005] fenetres MDI
    Par Sodangbe dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/04/2006, 10h59
  2. [VB.NET]une seule instance par fenetre MDI
    Par pat59 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/02/2006, 11h14
  3. Fenetre modale | Des threads en javascript ?
    Par siddh dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/11/2005, 12h06
  4. fenetre MDI - problème d'allocation
    Par say dans le forum C++Builder
    Réponses: 8
    Dernier message: 03/11/2005, 17h06
  5. Question sur la gestion des fenetres MDI
    Par RémiONERA dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/07/2005, 07h58

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