Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXÉCUTION D'UN THREAD SANS SURCHARGER LE PROCESSEUR


Information sur la source

Catégorie :VB.NET Source .NET ( DotNet ) Classé sous : thread, processeur, charge, addressof Niveau : Débutant Date de création : 05/04/2006 Vu : 7 933

Note :
6 / 10 - par 3 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note

Description

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

  • 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
            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

Commentaires et avis

signaler à un administrateur
Commentaire de Lucyberad le 06/04/2006 20:26:16

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...

signaler à un administrateur
Commentaire de eldim le 07/04/2006 07:45:52

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)

signaler à un administrateur
Commentaire de Lucyberad le 07/04/2006 19:21:40

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

signaler à un administrateur
Commentaire de Lucyberad le 07/04/2006 19:27:32

"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 !

signaler à un administrateur
Commentaire de OneHacker le 09/04/2006 10:54:26

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

signaler à un administrateur
Commentaire de Lucyberad le 09/04/2006 11:54:54

"ThreadStart" => ben il lance le thread et l'execute pardi ^^
"Moi j'utilise tout le temps un Thread et rien d'autre et c'est suffisant pour ne pas faire "RAMER" l'ordinateur !" => pareil, il faut en faire plusieur si tu fais plusieur requete en meme temps mais c'est rare comme utilisation...

je devrai faire un tuto sur le multithreading, avec la dose de gens que je corrige la dessus ^^

signaler à un administrateur
Commentaire de OneHacker le 09/04/2006 12:28:23

Ben j'utilise par ThreadStart pour le démarrer, je fais "Thread.Start()" tout bête, j'en fait pas plusieurs pour une même requête, je créer la une fonction qui relance le thread lorsque qu'il a finit, et avec cette fonction j'ai fait un prog qui prend 1 screenshot par milliseconde et enregistre l'image dans un dossier, ca marche impec !

En effet ca serait une bonne idée que tu fasses, un tuto.

Veux tu que je montre la procédure pour relancer indéfiniment le thread ?

Redman

signaler à un administrateur
Commentaire de Lucyberad le 09/04/2006 13:34:55

ha oui tu parlait de relancer un thread ^^
donc toi du dit de relancer le thread toute les 1 millisecondes pour effectuer le screenshot... ouais c possible mais fo faire gaffe car un pc mets + de 1ms a prendre un screen et le pc sera super ralenti au bout d'un moment a force d'avoir tout plein de thread qui travaille.
sinon pour la procedure => envoie c'est toujours bon a prendre. et pour le tuto ben je vais reflechir a sa composition ^^

signaler à un administrateur
Commentaire de OneHacker le 09/04/2006 17:38:16

Il a toujours un seul thread qui travaille car j'ai mis une sécurité donc toujours un thread et hyper efficace ! Sans ramer.

Voici la procédure avec la sécurité :

Try
            If tLoop Is Nothing Then
                tLoop = New Threading.Thread(AddressOf Action)
            End If

            If tLoop.ThreadState = Threading.ThreadState.Stopped Then
                tLoop = New Threading.Thread(AddressOf Action)
            End If

        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Exclamation)
        End Try

        If tLoop.ThreadState = Threading.ThreadState.Running Then
            Exit Sub
        End If

        Try
            tLoop.Start()
            tLoop.Join() ' Empêche que les threads se dépasse dans le temps
        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Exclamation)
        End Try

Redman

P:S, Pour la composition du tuto, je veux bien participer. Tu peux m'envoyer un MP.

signaler à un administrateur
Commentaire de eldim le 10/04/2006 07:46:15

Bonjour,

Désolé de ne pas avoir répondu plus tôt mais je ne bosse pas souvent le week-end...

si je fais comme ça c'est pour détecter la fin du thread qui est dans une API

Donc, il me faut bien vérifié s'il est terminé ou pas...

signaler à un administrateur
Commentaire de Lucyberad le 10/04/2006 11:27:42

pourquoi le thread principal doit verifier que le thread secondaire est terminé alors que avec mon code le thread secondaire dit lui meme au thread principal qu'il as fini, tout marche par evenement et non plus par boucle ce qui est economise BEAUCOUP de la puissance processeur.

signaler à un administrateur
Commentaire de eldim le 10/04/2006 11:47:47

c'est une autre méthode...

j'aime bien travailler par procedure pour avoir une continuité...

je vai tout de même essayer

sinon l'idée de mon source n'était pas trop mauvaise ?

signaler à un administrateur
Commentaire de Lucyberad le 10/04/2006 21:04:00

ecoute le code fonctionne, il fait le boulot demandé, c'est jsute que c'est pas "officiel" et que c'est pas tres economisateur pour le processeur, c'est tout de meme tres bien de voir que tu t'interresse et que tu ne capitule pas (apres le paté que je t'ai mis lol)
donc oui le code est bon, mais c'est pas celui que je recommande et de loin pas.

un code ayant le moins de boucle possible ne marchant que quasiement avec des evenements est un bon code.

signaler à un administrateur
Commentaire de eldim le 11/04/2006 07:36:10

ok
merci

(je suis pas du genre à abandonner lol)
(comme tout joueur de jeux videos lol)

signaler à un administrateur
Commentaire de eldim le 11/04/2006 08:54:22

je comprends que ta méthode est plus économe en ressource que la mienne seulement elle pose problème dans ma façon de programmer car :
je lance une instance de class1 qui lance une instance de class2 qui exécute le thread
or si je le fait avec ta façon lorsque le thread sera lancé l'exécution reviendra sur la class1
mais ce que je veux c'est l'exécution reste sur la class2 jusqu'à la fin du thread...
donc ma méthode me convient mieux...

signaler à un administrateur
Commentaire de Lucyberad le 11/04/2006 18:07:55

j'ai pas compris ou tu voulais en venir mais c'est pas grave, je pense que comme les source directX (bien hard) le multithreading c'est comme on le sent.
"comme tout joueur de jeux videos" => oui car tout les programmeur motivé sont des joueur (et souvent des bons lol)

signaler à un administrateur
Commentaire de eldim le 12/04/2006 07:41:04

lol
pas faux

signaler à un administrateur
Commentaire de Lucyberad le 12/04/2006 10:28:21

bon pour le tuto ca attendra la rentrée car la je suis pas en vacance moi encore et le pire chuis en semaine de bac blanc... et pis durant les vacs j'aurai pas de pc.
donc voila je m'y mettrait aux vacances.

signaler à un administrateur
Commentaire de Lucyberad le 12/04/2006 10:28:50

"m'y mettrait aux vacances." => a la rentrée...

signaler à un administrateur
Commentaire de eldim le 12/04/2006 16:27:38

comment tu fais pour faire ton invoke s'il n'y a pas de formulaire dans l'appli ??

signaler à un administrateur
Commentaire de OneHacker le 12/04/2006 16:43:37

Je suis pas tout le temps sur internet, je vais mettre une source qui montre l'utilisation de threads mais avant tout ca sera une source MailBomber, je pense qu'elle sera postée dans la journée.

Bonne continuation !

Redman

signaler à un administrateur
Commentaire de OneHacker le 12/04/2006 18:11:15

Voici ma source : http://www.vbfrance.com/code.aspx?ID=37020

Elle sera bientôt améliorée !

signaler à un administrateur
Commentaire de eldim le 13/04/2006 07:45:37

lol
t'as encore fait des betises avec tes sources...
va falloir faire des choses plus constructives si tu ne veux pas être interdit à chaque fois...

signaler à un administrateur
Commentaire de OneHacker le 14/04/2006 13:54:42

Ben c'est pas une bêtise c'est que certains utilisateurs se plaignet que des sources comme les Trojan, MailBomber, Sniffer etc... soit mise sur ce site !

D'ailleurs j'ai envoyé 10000 mails à un pote j'ai intérêt à vite lui enlevé sinon j'ai à faire à la police ! lol

Redman

signaler à un administrateur
Commentaire de eldim le 14/04/2006 14:50:41

lol
c'est normal faut pas encourager ce genre de chose qui sont néfastent pour les programmeurs et surtout les administrateurs réseau et système (et comme j'ai les 3 métiers en même temps je n'encourage surtout pas ce genre de chose)

signaler à un administrateur
Commentaire de OneHacker le 04/02/2007 19:17:48

lol c'est vrai mais maintenant je risque plus rien car j'ai trouvé des sécurités et j'ai boosté la vitesse par 5. avec un code qui fixe le nombre de thread maxi et chaque thread fait la même tâche.

Et là j'envoi 2 milliards de mails lol

signaler à un administrateur
Commentaire de Lucyberad le 07/02/2007 17:47:49

"Et là j'envoi 2 milliards de mails lol" c fout comme ca revolutionne la programmation...
oubli de mettre sur ton CV que t'a fait un mail bomber performant avec du multithreading.

signaler à un administrateur
Commentaire de eldim le 07/02/2007 17:58:49

lol

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

PB d'asressage lors de la compilation avec "AddressOf thread" !! HELP ME [ par happykiller ] Module utilisé : clsThreading.cls dl avec thread en mot cléje crée un thread.'Creation du threadmsg_console ("Creation du thread")ThreadControl1.Creat Controle de la charge processeur d'une tache [ par jack ] BonjourPour une fois, c'est moi qui pose la question, lolJ'ai une application serveur de documentation et, en même temps que mon serveur tourne, Recup de la charge UC [ par Minch ] Salut à tous! Je cherche désespérement à travers les sources et forums comment récupérer la charge UC, après a PVM et Thread [ par Vincentsoft ] Salut, Voila, j'ai un probleme avec les thread et PVM. Voila, j'ai un programme qui va lancer deux autres programme (le meme mais sur une autre machi COMPILATION POUR 2 CPU [ par Teo31 ] Bonjour,J'ai créé un exécutable VB sans Form et l'ai compilé. Je vous sollicite pour savoir si par hasard il y a des options de co N° du processeur [ par AVI17 ] Comment récupérer en vb6 le n° du processeur d'une machine/ Merci d'avance AddressOf ??? [ par ratala ] Bonjour, je suis débutant et je ne conprend pas tres bien a quoi sert la fonction AddressOf de plus la doc de VB n'est pas tres explicite pour ce xml et loadmovie [ par GregArtisi ] voila la situation: j'ai un swf qui charge du xml,tout marche a merveille. dans un autre fichier flash,je fait un loadmovie qui charge mon premier sw [VB.NET]Socket [ par shadow1779 ] j'ai vu un bon tuto sur les sockets en VB.NET cependant je me pose quelques questions,déja comment savoir si je suis vraiment connecté au so Charge une Image TGA et renvoyer un PNG [ par kzimir666 ] Bonjour,je souhaiterais savoir comment faire pour charger une image TGA avec PHP.Est-ce possible tout d'abord ?Ensuite, si ce chargement est possible


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.