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 !

MULTI THREAD


Information sur la source

Catégorie :API Niveau : Initié Date de création : 30/09/2002 Date de mise à jour : 04/10/2002 08:04:02 Vu / téléchargé: 15 024 / 1 966

Note :
8,29 / 10 - par 7 personnes
8,29 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Cliquez pour voir la capture en taille normale
Documentation de base pour utiliser les API multithread

'Creation d'un thread
CreateThread (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

lpThreadAttributes: sécurité,  mettre 0
dwStackSize : taille de la pile, 0 => meme taille que la pile du thread parent
lpStartAddress: adresse de la fonction à lancer.
exemple:
soit une function Toto()
lpStartAddress=AddressOf Toto, AdressOf donne simplement l'adresse de cette fonction.

lpParameter: parametre de la function, il faut savoir que votre thread partage les variables du thread parent.
dwCreationFlags: Permet de controler le thread, il est possible de créé un thread sans pour cela l'executer,
si dwCreationFlags=&H4 il est créé mais en attente. Si =0 il est executer imediatement
lpThreadID: pointeur sur l'ID du thread

La fonction retourne l'Handle du thread créé, si Null erreur.

'Destruction d'un thread
TerminateThread  (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
hThread: handle du thread (donner au moment de la creation)
dwExitCode: mettre 0.


'Changer la prioritée d'un thread
SetThreadPriority (ByVal hThread As Long, ByVal nPriority As Long) As Long
Il est possible de rendre plus ou moins prioritaire votre thread, un thread d'affichage sera Low, un thread de communication sera hight, Low=-2, Normal =0, Hight =2
Au moment de la creation la priorité d'un thread = priorité thread Parent.


'Connaitre la prioritée d'un thread
Function GetThreadPriority (ByVal hThread As Long) As Long
Donne la prioritée du thread

'Execute le thread
ResumeThread (ByVal hThread As Long) As Long
Permet d'executer un thread, s'il a été créé avec un Flag =Attente, cette API permet de l'executer

'Stop un thread
SuspendThread (ByVal hThread As Long) As Long
Fonction inverse de la précedente

'Donne le handle du thread en cours
GetCurrentThread () As Long

'Donne l'ID du thread en cours
GetCurrentThreadId () As Long

 

Source

  • 'Exemple:
  • 'Déclaration des API
  • Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
  • Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
  • Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
  • Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
  • Private Declare Function GetCurrentThread Lib "kernel32" () As Long
  • Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
  • public function Thread ()
  • dim mhandle as long
  • dim lpThreadID as long
  • 'Creation du thread
  • mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)
  • 'Connaitre la prioritée du thead créé
  • Priority = GetThreadPriority(mhandle)
  • 'Mettre une prioritée plus importante
  • Call SetThreadPriority(mhandle, 2)
  • 'Fin du thread
  • Call TerminateThread(mhandle, ByVal 0&)
  • end function
  • function Toto()
  • 'Mettre le code que vous voulez
  • end function
'Exemple: 

'Déclaration des API
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long

Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long

Private Declare Function GetCurrentThread Lib "kernel32" () As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long


public function Thread ()
 dim mhandle as long 
 dim lpThreadID as long

'Creation du thread
    	mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)

'Connaitre la prioritée du thead créé
 	Priority = GetThreadPriority(mhandle)

'Mettre une prioritée plus importante
	Call SetThreadPriority(mhandle, 2)


'Fin du thread
    Call TerminateThread(mhandle, ByVal 0&)
end function

function Toto()
'Mettre le code que vous voulez
end function 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de sephiro le 30/09/2002 12:27:30

Attention c'est tres instable sous VB avec le Debugger, une fois compilé pas de probleme, ne pas oublier de détruire TOUS les threads que vous avez créé.
Il est bien sur possible de créé plusieurs thread avec la meme function
mHandle1 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID1)
mHandle2 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID2)
mHandle3 = CreateThread(0,  0, AdressOf Toto, 0, 0, lpThreadID3)

signaler à un administrateur
Commentaire de zmat le 30/09/2002 23:41:08

Bsoir,
Juste une petite kestion : c koi un thread ? :-/

signaler à un administrateur
Commentaire de max12 le 01/10/2002 01:43:25 administrateur CS

Tu devrais donner plus de détail du genre c'est quoi un thread, a quoi sa sert un thread, quel avantage sa donne etc.......

signaler à un administrateur
Commentaire de Crazyht le 01/10/2002 09:24:19 administrateur CS

Alors un Thread se comporte comme un executable. Je m'explique, c'est une partie de code qui se deroule paralellement au reste de lexecutable. Il a l'avantage de partager les variables globales avec le programme principal (Qui est en fait lui aussi un thread). Ca a l'avantage de ne pas bloquer le programme lors d'un traitement. A titre d'exemple le module de recherche sous Word est un thread. Nous pouvons aussi siter les logiciels FTP, qui effectuent plusieurs transferts en simultanés.L'interface est le programme et chaque transfert est effectué dans un thread.

Voila en gros
@++
Crazyht

signaler à un administrateur
Commentaire de Mix78 le 01/10/2002 09:30:28

Un thread est un processus asynchrone auquel votre processeur accorde du temps d'éxecution...
C'est un peu comme quand vous mettez un Doevents dans votre code, si de instructions sont en attente la machine virtuelle de VB les executera avant de revenir au code après le Doevents... Le thread permet qu'une ou plusieurs fonctions de votre projet soient éxécutée de manière concurente au reste du code.
En pratique quand vous entrez dans une fonction VB vous n'en sortirez pas tant que le code de la fonction ne sera pas éxécuté;  mais vous pouvez lancer une autre fonction (Thread) et resortir de la première fonction sans que le code de cette fonction appellée soit totalement executé... Le code de la fonction threadée continura sont execution de son coté...

Voilà ,j'éspère que cette explication n'est pas trop mal expliquée :-)

signaler à un administrateur
Commentaire de zmat le 01/10/2002 14:53:10

Si je comprend bien, les threads ça m'permet de faire du multitâche avec mon appli vb ... !? si c bien ça, ça'm donne une idée des avantages mais ...
Quels sont les inconvénients des threads et surtout qu'est ce que je risque en les utilisant ?

Merci pour les explications
En passant, s'rait cool de poster un zip là dessus

signaler à un administrateur
Commentaire de couriousous le 01/10/2002 18:34:54

Enfin! Vla le chti bou de code que je cherche depuis 6 mois!!! en + les explications sont cool! juste une chite question, j'ai lu quekpar que si on met un doevents dans la fonction threadée, le thread est détruit ( ou se stope ) c juste ou faux?

signaler à un administrateur
Commentaire de couriousous le 01/10/2002 18:39:07

juste comme ca on peut récupérer la variable que retourne la fonction? ex:

function toto() as integer

si on la démarre avec un thread, peut-on récupérer la variable retournée au aussi: c'est comment qu'on sait que le tread à finit son action?

Thanks!

signaler à un administrateur
Commentaire de sephiro le 01/10/2002 19:08:11

La function Toto ne retourne rien , elle peut recevoir de parametre pendant son lancement, voir createThread et pParameter.
Le thread peut accéder au variable du thread parent (celui qui l'a lancé) il peut donc retourner tous ce que l'on veux. Il est possible de faire discuter plusieurs thread entre eux, via des Named Pipes (Je prepare un truc la dessus), ainsi qu'un Zip d'exemple.
Le gros probleme avec les threads sont leurs instabilités da

signaler à un administrateur
Commentaire de sephiro le 01/10/2002 19:09:24

La function Toto ne retourne rien , elle peut recevoir de parametre pendant son lancement, voir createThread et pParameter.
Le thread peut accéder au variable du thread parent (celui qui l'a lancé) il peut donc retourner tous ce que l'on veux. Il est possible de faire discuter plusieurs thread entre eux, via des Named Pipes (Je prepare un truc la dessus), ainsi qu'un Zip d'exemple.
Le gros probleme avec les threads sont leurs instabilités dans le debugger de VB, de plus il est impératif d'analyser votre probleme avant de commancer à utiliser les threads car vous etes tres vite submergé !!!!

signaler à un administrateur
Commentaire de sephiro le 01/10/2002 19:13:08

Pour savoir si ton thread est toujours la tu peux utiliser une API qui va te lister les handles ou les ID.
De plus à la fin de ta function Toto, le thread se termine. Si tu veux qu'il reste il est obligatoire de faire une boucle pour l'empécher de sortir.

signaler à un administrateur
Commentaire de couriousous le 02/10/2002 21:39:09

ok compris! ( named pipe? comme sous linux dans le shell?)

signaler à un administrateur
Commentaire de jenlain le 28/10/2002 18:48:48

ca marche pas, ton truc

signaler à un administrateur
Commentaire de bdpatrice le 21/11/2002 16:54:42

mHandle = CreateThread(ByVal 0&, ByVal 0&, AdressOf Toto, ByVal 0&, 0, lpThreadID)

j'ai une erreur de compilation sur le parametre "Toto" il ne veux pas le prendre
AdressOf Toto

comment faudrait-il l'écrire?

signaler à un administrateur
Commentaire de TheDjinn le 02/12/2002 22:16:31

ya pas sephiro, jte kif trop ;)
sof ke la cuila jsuis pas sur ki me serve tout de suite, jai pas besoin de multithread dans mon 'shell'... ;)

signaler à un administrateur
Commentaire de TheDjinn le 10/12/2002 22:52:57

bdpatrice : met tout dans un module
met un 2e d a adDress (jcroit kon peut escuser sephiro pour ca kan mm ;) )

le multi thread ca tu en tout cas un grand merci a sephiro ;)

signaler à un administrateur
Commentaire de Ouneufe le 07/01/2003 12:56:26

Rhaaaaaa, enfin une demo de thread ciselée et complète. Ouh là, je me sens défaillir de bonheur. hop : 10/10

signaler à un administrateur
Commentaire de bdufay le 16/01/2003 11:43:56

Nickel!

signaler à un administrateur
Commentaire de venomp le 11/03/2003 09:32:43

Le prog fonctionne au poil..
Mais je n'arrive pas a l'adapter a un de mes prog existant..
Je suis Sur NT 4 sp6. Quand je modifie mon prog et que je le lance dans l'ADI tout fonctionne, mais quand je crée l'exe et que je l'execute, Dr watson fait des siennes.. comment résoudre le pbm.
Note: je me suis servi de la classe du projet.

signaler à un administrateur
Commentaire de gogomanu le 19/06/2003 16:17:19

Excellent merci beaucoup ! J'ai besoin de faire un client serveur dont le serveur exécute des ordres, mais sans thread si le traitement n'est pas terminé il ne reçoit pas les autres demandes ! tu parles d'un serveur !  donc threads ! merci !

signaler à un administrateur
Commentaire de heine le 23/06/2003 15:47:12

super interressant les threads, mais j'eprouve un soucis... j'ai un,e fonction liberant la mémoire vive:

Dim Mo as variant
Mo = 100
Mo = Mo * 1024 * 1024
call space (Mo)
  voila ceci va liberer 100Mo de Ram,  cependant je voulais fais une barre de progression, mais avant tout fodra utiliser ce syteme de threads qui m'a l'air cool, mais je voi pas koi faire... ;) kelkun pourait m'expliker ?

signaler à un administrateur
Commentaire de heine le 16/01/2004 16:22:43

Bon j'ai réussi à exploiter ceci, je comprend pas trop mal le pricipe de fonctionement, mais j'ai toujours un soucis, pour tuer les threads on doit tuer l'application... :/ je pense qu'il faudrait pouvoir TUER et non mettre en pause le thread par le biais de son handle... à voir si c'est faisable, je v matter ca...

signaler à un administrateur
Commentaire de captaincav le 04/02/2004 10:18:14

merci pour tout ca :) vraiment :)

mais j'ai un petit soucis toutefois :/

J'utilise cette fonction de la facon suivante :

Public Function ma_fonction()
    MsgBox ("pouette")
End Function

Public Function Thread()
    Dim mhandle As Long
    Dim lpThreadID As Long
    mhandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf ma_fonction, ByVal 0&, 0, lpThreadID)

    Call TerminateThread(mhandle, ByVal 0&)
End Function

Public Sub Command1_Click()
   Call Thread
End Sub

Toutefois, en faisant ainsi, ma fonction n'est pas executé (pas de pouette qui s'affiche :/)!! J'ai l'impression que le Thread se termine directement apres. Comment faire pour remédier à cela ? Ou alors j'utilise tres mal tout ca ?

Merci :)

signaler à un administrateur
Commentaire de capoueidiablo le 09/07/2004 16:16:59

Salut à tous,
J'aimerais savoir s'il est possible d'envoyer plusieurs paramètre a la fonction Threadée ?

ex :
public Function Fonctionthread (Val1 as truc, Val2 as machin, ....)

dans ce cas à quoi doit etre égal "lpParameter" dans la fonction de création du Thread ?

Merci [:)]

signaler à un administrateur
Commentaire de occhipin le 30/07/2004 14:55:39

Moi aussi j'ai un problème avec AddressOf. Pourtant j'ai mis deux "d" à adresse. mais il accepte pas Toto après !
Donc voila si qqn sait pourquoi ca me met invalide use of propertie !!!!
Merci

signaler à un administrateur
Commentaire de occhipin le 30/07/2004 15:08:17

ah dsl le addressOf fonctionne (enfin ne cause plus d'erreur !) mais maintenant c'est CreateThread qui est function or sub not defined alors que je l'ai bien déclarer en haut j'ai aussi essayé de mettre les déclarations ds un module mais rien à faire toujours cette erreur "Function or Sub not defined" !!!

signaler à un administrateur
Commentaire de occhipin le 02/08/2004 10:47:10

Bon je vous jure c'est mon dernier message sur ce poste ! Mais il me reste un problème qui peut etre peut s'expliquer tout simplement !
En fait dans un module j'ai mis les déclarations createthread, terminatethread .... en mettant public à la place de private (c'est pour ca que ca mettait function undefined). Dans ce meme module g ma fonction toto. Mais à l'execution g une erreur de violation d'accès, en faisant un débug il est clair que c a cause du thread l'erreur est générée sur toto ! Donc voilou dsl pour tte ses questions mais il est vitale pour moi de trouver une solution à mon problème et donc de voir si je pe le résoudre par les threads !!! Merci

signaler à un administrateur
Commentaire de BruNews le 02/08/2004 11:41:18 administrateur CS

TerminateThread est une fonction d'URGENCE !!!
Ne doit jamais etre employe dans un code correct, un thread doit terminer proprement en retournant une valeur et liberer la memoire.
A la suite de TerminateThread il n'y a plus rien, stack initialisee non liberee, toute memoire allouee dans le thread idem (String vb est un bon exemple de memoire allouee dynamiquement et qui fuira a coup sur).
Les threads sont a employer dans un langage ou on peut les gerer, en VB absolument NON !!!

BruNews, Admin CS, MVP Visual C++

signaler à un administrateur
Commentaire de l0st3d le 22/10/2006 21:14:13

#1 t'a source. Merci beaucoup!

signaler à un administrateur
Commentaire de sephiro le 23/10/2006 08:18:15

Attention j'ai fais cette exemple juste pour prouver que du multi thread en VB 6 était possible, l'environnement de Debug est TRES instable. Utilise VB.net plus adapté

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

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 : 18,814 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é.