Multi thread

3/5 (39 avis)

Vue 22 511 fois - Téléchargée 2 546 fois

Description

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 :


'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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
1 mai 2010 à 16:07
L'usage du multithreading est certes déconseillé et souvent instable dans vb6 mais pas impossible. Cependant, l'usage de cette méthode, qui repose sur l'api CreateThread est obsolète aujourd'hui. Je vous recommande d'utiliser la méthode reposant sur l'api SHCreateThread dont voici un exemple ci-dessous. Allez dans ses commentaires, car j'explique comment faire réduire les risques de crash sous vb6 sp6.
Voir la source :
http://www.vbfrance.com/codes/SIMPLE-PROGRAMME-MULTI-THREAD_5590.aspx
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
30 mars 2010 à 11:21
Petite question toujours en rapport avec le multithread.
J'ai mon programme dans un thread(cloisonné) "thA". Ce programme possède une fenetre sur laquelle il y a une imagebox "ImgB"
J'ai pu constaté que entre threads je ne peut pas utiliser de variables globales (ou presque).
Est-ce que en récupérant le DC de l'ImgB je pourrais le modifier depuis un Thread cloisonné thB sans avoir de conflict de droit d'accès ?
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
18 mars 2010 à 10:03
a en fait je suis bête ^^
si je peux pas piloter la fenetre de puis un thread secondair, je n'ai qu'a mettre Excel en thread secondaire et laisser la gestion de la fenetre dans le thread principal...
ca marche tt de suite mieux ...

je me suis entêté dans la mesure ou il est dificile de lancer l'animation dans un autre EXE. l'annimation est intégré dans le "disign" de l'appli...

Raison trouvée : VB6 Standard EXE travail avec un(des) threads cloisonnés qui interdisent l'emploie de variables globales.
J'ai également vu dans un tuto que il faudrait compiler en "P-CODE" je ne sais pas ce que c mais ca ne m'a rien changé du tout...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
17 mars 2010 à 16:32
tu as n moyens a disposition...
mailslot, pipe, socket, messages, etc.

[mode pub on]
ou via cette petite source :

http://www.vbfrance.com/codes/COMMUNICATION-INTER-PROCESS-PARTAGE-MEMOIRE_39615.aspx
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 mars 2010 à 16:04
bien recu ^^
encore que je trouvais ma solution vraiment classe ^^
(ps comment tu communique entre 2 app ?)
Afficher les 39 commentaires

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.