Calcul infini avec reprise de la valeur par un label [Résolu]

Signaler
Messages postés
4
Date d'inscription
lundi 1 septembre 2008
Statut
Membre
Dernière intervention
12 février 2012
-
 Utilisateur anonyme -
Bonjour.
nous sommes en terminale S-SI et on doit réaliser un PPE. Notre ppe, plutôt ambitieux pour des terminales mais qui avance plutôt bien est de modifier un frigo pour le rendre plus "intelligent". En fait on y rajoute une fonction ouverture automatique accompagné de la sécurité, de la prise de température par une thermistance, la gestion entière de l'inventaire avec ajout/retrait d'objet dans le frigo (grâce a une BDD).

Le problème : la prise de température nous freeze le programme.
La solution trouvée : les background worker et les threads...

On n'y comprends pas vraiment quand a la liaison entre le main et le background.
Notre but : prise de la température par le background et envoie sur le main toutes les 2 secondes environ.

on aurait vraiment besoin d'aide, toutes nos recherches ne mennent a rien quand on met sur le programme en VB

Merci d'avance

5 réponses


Bonsoir,

@ucfoutu : meilleurs voeux (oui je sais, on est en février )

Comme un exemple vaut mieux qu'un long discours, voici une solution commentée :

Option Strict On
Public Class Form1
    'je déclare un délégué pour gérer les opérations inter-thread
    Delegate Sub DelegueChangementTemperature(ByVal Valeur As Integer)

    'je déclare ma thermistance
    Dim MaThermistance As Thermistance
    'j'ajoute un label au formulaire pour visualiser les données
    Dim MonLabel As New Label With {.Parent Me, .AutoSize True, .Font = New Font("Arial", 20)}


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'j'instancie ma thermistance
        MaThermistance = New Thermistance
        'je m'abonne à l'événement Température par la sub ChangementTemperatureThread
        AddHandler MaThermistance.Temperature, AddressOf ChangementTemperatureThread
    End Sub

    Private Sub ChangementTemperatureThread(ByVal Valeur As Integer)
        If Me.InvokeRequired Then
            'si un événement inter-thread intervient, j'invoque une instance de mon délégué qui 
            'se chargera de transmettre l'info à la sub affichage
            Me.Invoke(New DelegueChangementTemperature(AddressOf ChangementTemperature), Valeur)
        Else
            'sinon je passe directement l'info à la sub d'affichage
            ChangementTemperature(Valeur)
        End If
    End Sub

    Private Sub ChangementTemperature(ByVal Valeur As Integer)
        'j'affiche la valeur dans mon label
        MonLabel.Text = Valeur.ToString
    End Sub

End Class


'classe de la thermistance envoyant ses données depuis un thread toutes les 2 secondes
Public Class Thermistance
    'thread servant à ne pas freezer l'application
    Dim t As New Threading.Thread(AddressOf MaSub)
    'déclaration de l'événement de température (vous devrez surement utiliser des Double plutot que des integers)
    Event Temperature(ByVal Degres As Integer)

    Sub New()
        'démarrage du thread
        t.Start()
    End Sub

    Private Sub MaSub()
        'ici on doit déclarer, initialiser et connecter un port rs232 par exemple...
        '...
        Do
            'ici on commence à lire les données issues de la thermistance
            Threading.Thread.Sleep(2000)
            'là, j'ai utilisé un simple délai avec un nombre aléatoire pour simuler une température entre 5 et 19°
            'à remplacer par votre code d'acquisition des données de votre thremistance.
            Dim rd As New Random
            Dim TemperatureAleatoire As Integer = rd.Next(5, 19)


            'là, j'envoi l'information par un événement 
            'bien sur il faut 'parser' les données surement en ASCII et transformer en degrés)
            RaiseEvent Temperature(TemperatureAleatoire)
        Loop
    End Sub
End Class


Bonne nuit.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Bonjour,

et quelle est la relation entre tout cet exposé et le titre ?
quel est le bout de code (cette partie seule) qui "plante" tout ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
4
Date d'inscription
lundi 1 septembre 2008
Statut
Membre
Dernière intervention
12 février 2012

Merci infiniment... Je n'ai pas le temps de le tester maintenant mais ce soir oui. C'est vraiment bien commenté comparé a la plupart des autres sujets. merci beaucoup.

Je vous tiendrais au courant de notre ppe
Messages postés
4
Date d'inscription
lundi 1 septembre 2008
Statut
Membre
Dernière intervention
12 février 2012

je n'aime pas seulement copier coller ^^ j'essais de comprendre. c'est vrai que ce n'est pas vraiment difficile. J'ai appris le vb avec "lesiteduzero" et en fait il est plutot incomplet pour le moment je remarque ^^. J'avais bien vu les invoke mais je ne savais pas les utiliser (car évidemment pour toutes personnes commencant a utiliser les threads sans connaitre je pense que le problème est l'appel inter-thread.) ^^

Ce serait pour savoir : Threading.Thread(AddressOf MaSub) signifie quoi en fait ?

Réponse à ucfoutu : merci d'avoir répondu, la solution est celle de banana32

Précision, comment des amateurs on avait meme pas pensé au timer ... le sleep freeze mais pas le timer ^^

le sleep freeze mais pas le timer ^^

Un timer peut s'assimiler à un thread. Il ne freezera pas ton application mais ne t'épargneras pas la gestion des opérations inter-thread.

Thread(AddressOf MaSub) signifie quoi en fait ?

MaSub est la procédure exécutée par le thread. Bien entendu, ceci est un exemple. Je veux dire par là que tu devras gérer son arrêt, déconnecter le port, libérer les ressources etc... avant de fermer ton application.

Bonne nuit.