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 :

Mon application se fige lors d'une grosse procédure


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut Mon application se fige lors d'une grosse procédure
    Bonjour,

    je me permet de poster mon sujet sur ce forum car je ne trouve pas de solutions, voila j'ai une procédure 'envoi_general_sms' qui prend en paramètre un string 'msgs' contenant le message à envoyer.
    Cette procédure est chargé d'envoyer un message à tout les numéros de téléphone contenu dans la list 'identite_phone_general', la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'on envoi a tout le personnel un sms utiliser avec appel.vb pour envoyer un msg a tout le monde
        Public Sub envoi_general_sms(ByVal msgs As String)
            telephone_loaded() 'on remplis d'abord la list
            If identite_phone_general.Count = 0 Then 'si elle est vide on quitte la porcédure
                Exit Sub
            Else
                Dim i As Integer
                For i = 0 To identite_phone_general.Count - 1
                    envoi_sms(identite_phone_general(i), msgs.ToString)
                    Thread.Sleep(2000)
                Next
            End If
        End Sub
    la procédure 'envoi_sms' est chargé d'envoyer sur un port série la trame à un modem GSM afin d'envoyer un sms :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Public Sub envoi_sms(ByVal numero As String, ByVal message As String)
            If Test_RS232.SP_GSM.IsOpen = False Then
                log("Impossible d envoyer un sms le port COM est ferme")
                Exit Sub
            Else
                Dim carac As Char = ChrW(26) 'caractére de fin pour confirmer l'envoi
                Dim car_fin As String = ""
                Test_RS232.SP_GSM.WriteLine("AT+CMGS=" & numero & car_fin)
                Test_RS232.SP_GSM.WriteLine(message + System.Environment.NewLine + carac)
            End If
    Mon soucis est que pour un seul envoi de sms, ca fonctionne bien l'application ne se fige pas, mais lorsque je dois envoyer plusieurs SMS à l'aide de la procédure 'envoi_general_sms' l'application est bloqué jusqu’à ce que tout les sms soit envoyé a la list 'identite_phone_general'. en effet je dois attendre 2 secondes entre chaque envoi le temps que le modem envoi la trame.
    Ainsi comment puis je faire pour éviter le blocage de l'application durant l'envoi de tout les SMS ?

  2. #2
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    merci pol63 j'avais aussi pensé a un thread mais la question que je me pose est ou le placer ???

    si je le met dans la procédure : Public Sub envoi_sms(ByVal numero As String, ByVal message As String) j'aurais un passage de plusieurs paramètres à faire !!
    et si je la met dans la procédure : Public Sub envoi_general_sms(ByVal msgs As String) il faudra aussi que je passe un paramètre !

    En fait c'est le la pause de 2 secondes : Thread.Sleep(2000) qui fige mon applications mais qui est necessais entre chaque envoi de trame vers le modem GSM, car il n'y a pas de buffer dans le modem, ainsi si je fait plusieurs envoi_sms(ByVal numero As String, ByVal message As String) les un a la suite des autres sans pause, seul le premier message sera traité !

    Donc ma question est peu être bête mais puis je placer un thread sur Thread.Sleep(2000) pour ne pas figer l'interface ??? ou dans le cas contraire ou le placer ?

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub envoi_general_sms_start(ByVal msgs As String)
      dim th as new system.threading.thread(addressof envoi_general_sms)
      th.Start(msgs)
    end sub
    la signature de envoi_general_sms doit peut être être modifiée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Ok polo63 j'ai donc suivi ce qui tu ma dit ainsi voila mon code modifier :

    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
    Module GSM
     
        Public thread_group As New Thread(New ParameterizedThreadStart(AddressOf envoi_general_sms))
     
       'je passe le message en objet car c'est un thread
       Public Sub envoi_general_sms(ByVal msgs As Object)
            telephone_loaded() 'on remplis d'abord la list
            If identite_phone_general.Count = 0 Then 'si elle est vide on quitte la porcédure
                Exit Sub
            Else
                Dim i As Integer
                For i = 0 To identite_phone_general.Count - 1
                    envoi_sms(identite_phone_general(i), msgs.ToString)
                    Thread.Sleep(2000)
                Next
            End If
        End Sub
     
    End Module
    et ensuite j'appel mon thread a partir de ma form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If CheckBox_tout_personnel.Checked = True Then
                GSM.thread_group.Start(TextBox2.Text.ToString)
            Else
                'on envoi à la personne selectionner dans la combobox
                envoi_sms(ComboBox1.SelectedValue, TextBox2.Text)
                Me.Close()
                MsgBox("Message envoyé !")
            End If
        End Sub
    J'ai testé ce code mais rien ne se passe !! je ne reçoit rien sur le port COM aurais je oublié quelques choses ???
    j'ai mis des breakpoint et on passe bien dans la procédure envoi_general_sms avec le message passé en paramètre !

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    En faite je viens de remarquer que ma procédure envoi_sms lève une exception qui écrit dans un fichier texte, voici la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Public Sub envoi_sms(ByVal numero As String, ByVal message As String)
            If Test_RS232.SP_GSM.IsOpen = False Then
                log("Impossible d envoyer un sms le port COM est ferme")
                Exit Sub
            Else
                Dim carac As Char = ChrW(26) 'caractére de fin pour confirmer l'envoi
                Dim car_fin As String = ""
                Test_RS232.SP_GSM.WriteLine("AT+CMGS=" & numero & car_fin)
                Test_RS232.SP_GSM.WriteLine(message + System.Environment.NewLine + carac)
            End If
     
        End Sub
    et donc l'exception levé dans mon fichier texte est la suivante :
    29/09/2014=19:57:46=Impossible d envoyer un sms le port COM est ferme

    pourtant j'ai ouvert le port COM à l’ouverture de l'application ! dois je aussi l'ouvrir au début du thread ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Je saute dans le sujet au passage.

    Pour les cas "basiques" et courant de procédure, fonction qui prennent un peu trop de temps et doivent être exécuter sur un thread spécifique (pour ne pas bloquer l'interface). Je recommande d'utiliser le composant background worker plutôt que de s'amuser à créer soit même ses threads à la main (même si ça reste intéressant pour la connaissance générale).

    Sinon effectivement, il est préférable d'ouvrir ton port dans le thread (et de le fermer aussi).

  8. #8
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    D'accord merci pour tes conseils mais la en l'occurrence le backgroundworker ne permet pas de passer un paramètre contrairement au thread !

  9. #9
    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
    utilise une variable privée dans la classe
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Tu peux mettre un objet en paramètre de la fonction RunWorkerAsync(Object) et ce dernier peut être récupérer sur la propriété Argument du DoWorkEventArgs dans l'événement DoWork

  11. #11
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    utilise une variable privée dans la classe
    Pourquoi est ce que je dois utiliser une variable privée ???

  12. #12
    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
    Citation Envoyé par gastoncs Voir le message
    Pourquoi est ce que je dois utiliser une variable privée ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private sub A
       B("test")
    end sub
     
    private sub B (s as string)
      msgbox (s)
    end sub
    une variable privée peut être utilisée dans plusieurs méthodes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private _variable as string
     
    private sub A
       _variable = "test"
       B
    end sub
     
    private sub B
       msgbox (_variable)
    end sub
    mais sinon tu peux passer un argument avec le backgroundworker
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. MySQL indisponible lors d'une grosse requête
    Par Guireg dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/07/2009, 10h51
  2. [Applet] Mon image s'efface lors qu'une fenêtre passe au dessus
    Par chouaiebnabil dans le forum Graphisme
    Réponses: 9
    Dernier message: 28/05/2009, 16h13
  3. Message d'erreur lors d'une grosse requete
    Par tony8716 dans le forum Développement
    Réponses: 9
    Dernier message: 03/01/2008, 10h34
  4. Message d'erreur lors d'une grosse requete
    Par tony8716 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 03/01/2008, 10h34

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