Multithreading activex

4/5 (7 avis)

Vue 6 371 fois - Téléchargée 837 fois

Description

Méthode de multithreading de référence d'après microsoft. Sans API, projet activeX standalone. Le projet montre comment créer des threads compartimentées. Le multithreading est déconseillé en VB6 utilisant les API de création de thread tel que SHCreateThread mais pas du tout risqué avec cette présente méthode. C'est une méthode peu connue et efficace. Elle est peu connue car peu de livre en font référence tout simplement. Cette présente méthode isole les variables des threads en les compartimentant (apartment threaded). En activeX, les threads doivent attendre car il y a des priorités de lecture/écriture.

Cette présente source, simule l'exécution d'un calcul lancé dans des threads isolées. Le résultat des threads (des calculs) sont récupérés à l'aide de RaiseEvent.

Pour envoyer une variable dans une thread, on utilise les property des class.

La mise en œuvre de cette méthode est complexe. Mais j'ai essayé de vous préparez le terrain pour l'implémenter dans vos projets. Plusieurs critères doivent être respectés :
- Projet non standard exe mais activeX standalone
- Démarrer le programme avec une procédure Sub Main ()
- Configurer "Thread per object" dans les propriétés du projet. Ce qui correspond au nbre de threads non limités
- Compilation p-code ou natif
- Choisir Standalone dans l'option "component"
- Création de thread via CreateObject(...)
- La class qui crée la thread doit être de type "multiuse"
- Un délai doit être créé dès la création de la thread (notion de callback à l'aide d'un timer d'une form)
- Les variables à envoyer dans la thread, doivent être envoyées via les property de la procédure à envoyer en thread
- La procédure à exécuter dans une thread (ici un calcul) doit être dans une class multiuse et doit générer des évènements (events)
- Les variables en sortie de la thread doivent être récupérées à l'aide d'évènements RaiseEvent
- Faut compiler le projet pour utiliser le multithreading

Cette source illustre la simulation d'un calcul exécuté dans un thread. La variable envoyé en entrée est la durée du calcul. Le résultat du calcul est récupéré à l'aide de RaiseEvent dans la form principale.

Le code contient une simple interface permettant de créer une thread et un compteur +1. Le compteur permet juste d'observer que la fenêtre n'est pas figée durant le multithreading. Cette méthode est interessante pour processeur multicore (processeur à plusieurs coeurs). Par exemple, choisissez 4 threads pour observer que 100% des ressources d'un processeur 4 cores seront utilisées.

Les options de résultat simultanés ou les uns après les autres, permettent de montrer comment récupérer des résultats de deux manières.

Les deux class nécessaires pour le multithreading peuvent-être facilement réutilisable pour vos programmes.

Principe de multithreading activeX issus du livre "Programming Microsoft Visual Basic 6.0 / Francesco Balena".

Conclusion :


Faut compiler le projet pour utiliser le multithreading.

Les deux class nécessaires pour le multithreading peuvent-être facilement réutilisable pour vos programmes.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
chieur Messages postés 67 Date d'inscription dimanche 22 février 2004 Statut Membre Dernière intervention 27 mai 2009
5 juin 2010 à 20:30
re phil g pa retel le cod kel modif a tu apporte ?
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
4 juin 2010 à 00:18
J'ai mis à jour la source. Grâce à toi grrnfr, j'ai enfin compris comment faire pour récupérer le résultat de variable issus de threads. Merci. En tous cas, cette méthode est vraiment excellent.
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
31 mai 2010 à 17:48
merci de ta contribution grrnfr, je vais donc inclure cette astuce dans la source. J'ai publié la source pour montrer comment faire.
cs_grrnfr Messages postés 1 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 31 mai 2010
31 mai 2010 à 08:52
Bonjour à tous,
Personellement, je fais du multi-threading en VB6 en programmant les threads dans des projets "ActiveX exe" et le programme principal dans un projet "standard exe".
La communication entre les le programme principal et les threads se fait via les méthodes et les events des ActiveX exe. C'est juste un peu galère si on instancie un array de threads quand on veut récupérer les events mais ça marche super bien.
Quel est l'avantage de la méthode proposée ici ?
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
26 mai 2010 à 16:57
Oui c'est que j'ai expliqué rapidement dans la description. On ne peut pas passer le contenu d'une variable de la thread principale aux autres threads et vice versa. Cependant, je suis sûr que c'est possible et je cherche d'ailleurs une solution.

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.