Exécution d'un thread sans surcharger le processeur

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 469 fois - Téléchargée 30 fois

Contenu du snippet

Exécution d'un thread sans surcharger le processeur (util pour l'utilisation de CopyFileEx ou toute fonction qui utilise un delegate)
Version VB.NET 2003

Source / Exemple :


Dim Ths As System.Threading.ThreadStart = New System.Threading.ThreadStart(AddressOf MaProcedure)
            Dim Th As System.Threading.Thread = New System.Threading.Thread(Ths)
            Th.Priority = System.Threading.ThreadPriority.BelowNormal
            Th.IsBackground = True
            Th.Start()
            Do
                Th.Join(1)
                Application.DoEvents()
            Loop Until Not Th.IsAlive

A voir également

Ajouter un commentaire

Commentaires

Lucyberad
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
1 -
ca manque de commentaires ce code...
explique les lignes: Th.IsBackground = True et Application.DoEvents()
car la je voit pas ce que ca peut faire au thread...
cs_eldim
Messages postés
961
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
-
Salut Lucyberad !

Le fait de mettre un doevents permet à ton application de se rafraichir donc pas de blocage
Le join permet de libérer les ressources
Le isbackground ben traduit le en français...(arrière plan)
Lucyberad
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
1 -
ouais ca j'avais compris que traduit ca donnait en arriere plan, mais ca agit comment sur le thread en lui meme, ca lui fait quoi?
car voila ma pensée: un thread est un sorte d'"executable" a lui meme qui effectue un bout de code, il y as le thread principal qui fait l'affichage et les ligne de code que on lui donne. On crée un deuxieme thread, ce second thread ne va rien faire en rapport avec le premier et va executeer sa ligne de code, ce second thread (si il est prevu dans ce cas) va effectuer sa tache et rendre un objet au thread principal ou simplement lui faire executer une fonction.
donc voila mon mailaise a propos de isbackground car un thread travaille forcement en arriere plan.

ensuite y'as encore un truc qui me titille, en gros apparament ton code regarde sur le thread secondaire a pas planté, bien mais voila tu rajoute dans ta description "sans surcharger le processeur" or le fait de faire un do loop (une boucle sans fin) est a mon avis beaucoup plus bouffeur de ressource que le second thread qui va etre en "BelowNormal" donc ce que tu cherche a reduire d'un coté tu le compense ensuite de l'autre...

bon donc j'essaie de decoder ton code:
- il permet de lancer un thread mais sans qu'il predomine (d'où le belownormal)
- ensuite tu attend la fin d'un thread avec join. sans arguments join attend la fin du thread, or l'integer (ici 1) determine le temps que le join va attendre la fin du thread secondaire, la tu l'attend 1ms. et ensuite si le join fonctionne pas ben voila le thread principal continue son code
- pour eviter ca tu as mis un do loop pour verifier en permanence la fin du thread sur un laps de 1ms et pour eviter que le do loop bloque le programme durant son executaion, tu as mis Application.DoEvents()

voila, en fait ton thread principal scan si le thread secondaire a fini, mais voila il est largement plus simple que le thread secondaire dise qu'il as fini tout seul comme un grand !
c'est pourquoi ce code est extremement plus propre:
Private Sub Lancer_Thread()
Dim Thread1 As New Threading.Thread(AddressOf Sale_Boulot)
Thread1.Start()
End Sub

Private Sub Sale_Boulot()
'ici on mets le code que le thread secondaire doit effectuer
Dim UneVariable as String = "Je suis une variable"
Me.Invoke(New Evenement(AddressOf Fin_Thread), UneVariable)
End Sub

Private Delegate Sub Evenement(ByVal UneVariable As String)

Private Sub Fin_Thread(ByVal UneVariable As String)
'cette fonction la grace a la fonction delegate est lancée sur le thread principal (celui de l'application) et recoi le string UneVariable en cadeau.
MsgBox(UneVariable)
End Sub
Lucyberad
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
1 -
"ensuite y'as encore un truc qui me titille, en gros apparament ton code regarde sur le thread secondaire a pas planté" => j'ai dit ca mais je me suis gouré, ton code attend juste la fin du thread secondaire (comme mon analyse le constate apres ^^)

sinon voila le multithreading n'est pas une tache simple, il est juste que tu as mal pris le prblm et j'essaie de te guider, voila donc ils ne faut pas prendre mal le fait que je te corrige, mais plutot le prendre comme une source d'interessement. (ce qui prouve le long texte precedemment posté)

bonne chance !
OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1 -
Je suis du même avis de LucyBerad...

LucyBerad -> Do Loop sert à attendre que le thread ai fini sinon le programme se ferme juste après le démarrage du thread(lorsque on commence par SubMain, inutile lorsque l'objet de démarrage est ue fenêtre)

Eldim -> A quoi sert ThreadStart ??!!

Moi j'utilise tout le temps un Thread et rien d'autre et c'est suffisant pour ne pas faire "RAMER" l'ordinateur !

Redman

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.