Un simple programme multi-thread

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 481 fois - Téléchargée 38 fois

Contenu du snippet

On peut facilement créer une app. mutli-thread avec VB grace au VB !
Mais attention, c'est risqué ! (ça plante pour un rien)

A mettre dans un module et sub main en démarrage

Source / Exemple :


Public Const CTF_COINIT = &H8
Public Const CTF_INSIST = &H1
Public Const CTF_PROCESS_REF = &H4
Public Const CTF_THREAD_REF = &H2

Public Declare Function SHCreateThread Lib "shlwapi.dll" (ByVal pfnThreadProc As Long, pData As Any, ByVal dwFlags As Long, ByVal pfnCallback As Long) As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long

Dim nb_t& ' Nombre de thread

Sub main()
    ' On crée les thread
    SHCreateThread AddressOf ShowMsgBox, ByVal 0&, CTF_INSIST, ByVal 0&
    SHCreateThread AddressOf ShowMsgBox, ByVal 0&, CTF_INSIST, ByVal 0&
    SHCreateThread AddressOf ShowMsgBox, ByVal 0&, CTF_INSIST, ByVal 0&
    
    MsgBox "Vous devez fermer les autres boites de dialogue avant de fermer celle-la", vbCritical, "Attention"
End Sub

Sub ShowMsgBox()
    nb_t = nb_t + 1
    Call MsgBox("Mstgbox executé depuis la thread n°" & nb_t, vbInformation, "Multi-Thread")
End Sub

A voir également

Ajouter un commentaire

Commentaires

Philippe734
Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
-
@forestlaw : oui, je crois que dans votre cas l'affaire ne sera pas réglée. Cette méthode ci-dessus est excellent juste pour soulager d'un ou deux calculs lourds. Elle n'est pas conseillée pour répartir l'ensemble des taches d'un programme dans différentes threads.
forestlaw
Messages postés
1
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
25 mai 2010
-
Bonjour Philippe74,

tout d'abord merci pour votre travail à ce sujet. Il y a par contre quelques zones d'ombre que je souhaiterai éclaircir avec vous.

Je vous expose ma problématique : j'ai un base Access effectuant des traitements assez lourds. Je souhaiterai offrir à l'utilisateur la possibilité d'effectuer certains travaux en tache de fond. Par ex, je sais qu'il utilise cette base pour faire des contrôles de cohérence. Ceux-ci sont en 4 étapes. Je souhaiterai donc, pendant qu'il contrôle l'étape 1, lancer l'étape 2 en tache de fond puis l'étape 3, etc ... Le but étant qu'il ne soit quasiment jamais bloqué. Le hic est que vous dites dans votre exemple ci-dessus qu'il faut mettre les autres événements en stand by le temps que le thread finisse son travail. Je retombe donc sur le meme problème qu'avant donc non ?

Merci d'avance pour votre réponse !!!

Patrice
Philippe734
Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
-
Afin d'illustrer mes conseils, j'ai fait une source que vous trouverez ici :
http://www.vbfrance.com/codes/DEMO-MULTITHREADING-PRISE-CHARGE-CPU-MULTI-CORE-AVEC_51734.aspx
Philippe734
Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
-
Fonctionne aussi sous vista et seven en suivant mes conseils
Philippe734
Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
-
Par désactiver les autres évènnemnents du programme, j'entend ce genre d'opération :
Par exemple, si dans le programme, il y a un bouton About affichant une form :
Private Sub cmdAbout_Click()
'aucune action si une thread est en cours
If ThreadEnCours = True Then Exit Sub

Load frmAbout
frmAbout.Show
End sub

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.