Multi thread

Soyez le premier à donner votre avis sur cette source.

Vue 21 764 fois - Téléchargée 2 465 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

Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
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
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
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 ?
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
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...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
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.