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 :

[VB.net]system.outofmemoryexception


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut [VB.net]system.outofmemoryexception
    Bonjour a tous, j'espere que quelqu'un pourra m'aider.

    Voila, mon appplication utilise plusieurs threads (9 en tout) et lorsque je la démarre j'ai ce message d'erreur, mais une fois démarré et le message affiché, elle tourne parfairement, le probleme c'est que je peux pas me débarraser de ce mesage, ma seule alternative est de quitter l'application.
    J'ai raccourci mon, mais il y a bien 8 autres threads, 1 par fonction

    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
    Imports NationalInstruments.DAQmx
    Imports System.Threading
    Imports Microsoft.VisualBasic
    PublicClass Form1
    Inherits System.Windows.Forms.Form
    Private myTask2 As Task
    Private myTask4 As Task
    Private myTask5 As Task
    Private myDigitalReader2 As DigitalSingleChannelReader
    Private myDigitalReader4 As DigitalSingleChannelReader
    Private myDigitalReader5 As DigitalSingleChannelReader
    Private firstEdge As CITwoEdgeSeparationFirstEdge
    Private secondEdge As CITwoEdgeSeparationSecondEdge
    Private myTask As Task
    Private trigger1 As Task
    Private counterInReader As CounterReader
    Private _threadCalculs1 As Thread
    Private _threadCalculs2 As Thread
    Private _threadCalculs3 As Thread
    Private _threadCalculs4 As Thread
    Private _threadCalculs5 As Thread
    Private _threadCalculs6 As Thread
    Private _threadCalculs7 As Thread
    Private _threadCalculs8 As Thread
    #Region " Code généré par le Concepteur Windows Form "
    #EndRegion
    
    PublicSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
     
    Timer1.Enabled() = True
    myTask2 = New Task
    myTask2.DIChannels.CreateChannel("Dev1/port2/line0:7", "read2_digits", ChannelLineGrouping.OneChannelForAllLines)
    myDigitalReader2 = New DigitalSingleChannelReader(myTask2.Stream)
    myTask4 = New Task
    myTask4.DIChannels.CreateChannel("Dev1/port4/line0:7", "read4_digits", ChannelLineGrouping.OneChannelForAllLines)
    myDigitalReader4 = New DigitalSingleChannelReader(myTask4.Stream)
    myTask5 = New Task
    myTask5.DIChannels.CreateChannel("Dev1/port5/line0:7", "read5_digits", ChannelLineGrouping.OneChannelForAllLines)
    myDigitalReader5 = New DigitalSingleChannelReader(myTask5.Stream)
    EndSub
    
    PrivateSub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
    'Connection pci dio 96 port 2
    Dim readData2() AsBoolean
    readData2 = myDigitalReader2.ReadSingleSampleMultiLine()
    Babord.Value = readData2(6)
    Tribord.Value = readData2(5)
    
    ...blablabla
     
    'Affichage du mode 3d ou 2d
    If readData4(6) = TrueThen
    Mode.Text = "3D"
    ElseIf readData4(6) = FalseThen
    Mode.Text = "2D"
    EndIf
    C1.Value = c1pret.Value
    C2.Value = Not c2pret.Value
    C3.Value = c3pret.Value
    C4.Value = Not c4pret.Value
    'crée un délégué et affiche le delai de manière asynchrone
    StartThread()
    StartThread1()
    StartThread2()
    StartThread3()
    StartThread4()
    StartThread5()
    StartThread6()
    StartThread7()
     
    EndSub
    'Programmation de fonction, une par délai, cette fonction est programmée 8 fois
    PublicSub delais1()
     
    Dim max AsDouble = 0.3
    Dim min AsDouble = 0.001
    Dim valeurdelai AsString
    myTask = New Task
    Dim channel AsString
    myTask.CIChannels.CreateTwoEdgeSeparationChannel("Dev2/ctr0", "", min, _
    max, CITwoEdgeSeparationFirstEdge.Rising, CITwoEdgeSeparationSecondEdge.Rising, CITwoEdgeSeparationUnits.Seconds)
    counterInReader = New CounterReader(myTask.Stream)
    Dim data AsDouble = counterInReader.ReadSingleSampleDouble()
    valeurdelai = data.ToString
    Delai1.Text = valeurdelai
    EndSub
    
    
    DelegateSub quitte()
    PublicSub fermeture()
    Me.Dispose()
    Me.Close()
    EndSub
     
    
    
    PrivateSub StartThread()
    _threadCalculs1 = New Thread(AddressOf delais1) 
    _threadCalculs1.Name = "Thread1" 
    _threadCalculs1.Start() ' Démarrage du thread.
    EndSub
    
    
    PrivateSub quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles quitter.Click
    Dim fermeture1 AsNew quitte(AddressOf fermeture)
    fermeture1.BeginInvoke(Nothing, Nothing)
    EndSub
    
    
    EndClass
    

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Je vois que tu utilises NIDAQmx.
    D'après le peu que j'en sais, les objets Task sont eux même des threads.
    Si en plus d'avoir 5 Task, il y a 8 threads qui en créent 8 autres, ça fait beaucoup trop de threads...

  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Tu pourrais optimiser ta gestion des threads de calcul en ne les créant pas toi même, mais en utilisant le Pool de Thread .NET.

    Cela donnerai un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ThreadPool.QueueUserWorkItem(addressof FuncCalcul1)
    ThreadPool.QueueUserWorkItem(addressof FuncCalcul2)
    ThreadPool.QueueUserWorkItem(addressof FuncCalcul3)

  4. #4
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    OK merci, je pensais justement à ça. Je vais my' atteler . Sinon pour daqmx, je crois pas qu'il crée lui meme d'autre threads, parce que j'ai essayé sans les faire moi meme, et la catastrophe.

  5. #5
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    Ouaip, maintenant si je mets ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    ThreadPool.QueueUserWorkItem(addressof delais1) 
    
    Il me dis "la methode public sub delais1() n'a pas la meme signature que le délégué delegate sub WaitCallback (state as object)"

    Pardon je débute en VB.net alors ....

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    delais1 doit avoir cette signature

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub delais1(State As Object)


    Quelle est sa signature actuelle?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    On peut aussi signaler que la communication inter-threads pose quelques problèmes.
    En particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Delai1.Text = valeurdelai
    risque fort de planter si c'est bien un appel d'un contrôle à partir d'un autre thread...

  8. #8
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    c'était delais1() tout court.
    J'ai essayé la methode de pool. Ok plus de message d'exception, de gele etc... mais mon application bloque ailleur maintenant, elle plante pas mais rien ne marche sur mon interface.

  9. #9
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par NicolasG
    On peut aussi signaler que la communication inter-threads pose quelques problèmes.
    En particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Delai1.Text = valeurdelai
    risque fort de planter si c'est bien un appel d'un contrôle à partir d'un autre thread...
    Nico d'avoir anticiper la question suivante

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Tout ça pour dire que l'utilisation des threads doit être réservée aux cas où c'est indispensable.
    Sinon, c'est aller au devant d'ennuis de mise au point.

    Quand on fait de l'acquisition de donnée, on laisse faire le matériel. Il fait son travail tout seul et renvoi ses résultats en RAM avec un accès DMA.
    Il suffit de le configurer correctement pour ça.

    Ensuite, on peut d'aller lire les résultats périodiquement : un timer suffit.

  11. #11
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par grand_prophete
    c'était delais1() tout court.
    J'ai essayé la methode de pool. Ok plus de message d'exception, de gele etc... mais mon application bloque ailleur maintenant, elle plante pas mais rien ne marche sur mon interface.
    C'est parce que tu utilises des méthodes de controles utilisateurs (delai1.Text) dans un thread qui n'a pas crée le controle. C'est interdit dans Windows et ça peux faire freezer l'appli.

    Utilise BeginInvoke pour cela

    exple

    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
    'A definir hors de la classe
    Delegate sub UnDelegateQueTuAsDefiniDlg(valeur as Integer, TextBox txt)
     
     
    'A definir dans la classe
    private UnDelegateQueTuAsDefini as new UnDelegateQueTuAsDefiniDlg(addressof UpdateDelaiUI)
     
    Sub UpdateDelaiUI(valeur as String, TextBox txt)
        txt.Text = valeur
    End Sub
     
     
    If InvokeRequired then
        BeginInvoke(UnDelegateQueTuAsDefini, new Object() {ValeurDelai, DElai1 })
    else
       DElai1.Text = valeurdelai
    endif

  12. #12
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    ok.
    Tu pourrais me donner des précisions sur ce qu'il y a entre parentheses ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Delegate sub UnDelegateQueTuAsDefiniDlg(valeur as Integer, TextBox txt)
     
    Sub UpdateDelaiUI(valeur as String, TextBox txt)
    TextBox txt est surligné en bleu (erreur quoi)
    Merci

    (mon dieu je commence pas la programmation parce qu'il y a de plus simple)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par grand_prophete
    (mon dieu je commence pas la programmation parce qu'il y a de plus simple)
    En même temps, pourquoi faire simple quand on peut faire compliqué...

  14. #14
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    Parce que j'ai pas le choix. Je dois créer une interface pour la boite où je fais mon stage, c'est pas pour le plaisir, même si j'aime bien ce que je fais. J'ai essayé d'autres solution simples mais ça marche pas, les mesures de délais sont très longues, y'a plusieurs secondes entre chacunes d'entre elles, et j'en ai 8 a effectuer en permanence, plus d'autres taches qui vont arriver par la suite.Tu vois un peu mon probleme. Et c'est la premiere fois que je touche à VB.net. La prog c'est pas ce que j'ai fais le plus pendant mes études

  15. #15
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    J'ai comme un doute.

    C'est quoi Delai1.Text ?? Delai1 est de quel type?

  16. #16
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    delai1.text c'est juste un textbox. Oui pardon ne pas confondre les fonctions sub que j'ai appelé delais(1 à 8) et les textbox qui vont afficher ces delais).

  17. #17
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Delegate sub UnDelegateQueTuAsDefiniDlg(valeur as String, txt As TextBox)
     
    Sub UpdateDelaiUI(valeur as String, txt As TextBox)
    ça devrait être mieux là

  18. #18
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    ok merci

    J'espere que je vais finir par m'en sortir.

  19. #19
    Membre du Club Avatar de grand_prophete
    Inscrit en
    Avril 2005
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 85
    Points : 40
    Points
    40
    Par défaut
    Ducoup si tu pouvais me réecrire le bout de code avec la correction parce que la je m'embrouille un peu les pinceaux. C'est l'utilisation de "valeur" par rapport a valeurdelai qui m'embete un peu.

  20. #20
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    'A definir hors de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Delegate sub UnDelegateQueTuAsDefiniDlg(valeur as String, txt As TextBox)
    'A definir dans la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     private UnDelegateQueTuAsDefini as new UnDelegateQueTuAsDefiniDlg(addressof UpdateDelaiUI)
     
    Sub UpdateDelaiUI(valeur as String, txt As TextBox )
        txt.Text = valeur
    End Sub
    'Et dans ta fonction au lieu de faire Delai1.txt = valeurDelai, fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If InvokeRequired then
        BeginInvoke(UnDelegateQueTuAsDefini, new Object() {ValeurDelai.ToString(), Delai1 })
    else
       DElai1.Text = valeurdelai.ToString()
    endif

Discussions similaires

  1. [ASP.Net] System. Net. Mail
    Par beowax dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/10/2006, 10h05
  2. [VB.NET] System.Security.Permission ....
    Par ludovic85 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/10/2006, 12h24
  3. Réponses: 2
    Dernier message: 11/10/2006, 11h36
  4. [vb.net] [System.Threading] Etats d'un Thread
    Par arnolem dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/01/2006, 17h41
  5. [VB.NET] System.NullReferenceException
    Par LeGrosWinnie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/12/2005, 14h31

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