MULTI THREAD

cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008 - 30 sept. 2002 à 12:27
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 - 1 mai 2010 à 16:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/4640-multi-thread

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 74
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 ?)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 mars 2010 à 14:04
si c'est juste pour une animation...
lance un exe a part qui affiche l'animation...

en communiquant avec lui, tu pourras lui faire afficher un message t'indiquant l'avancement, etc.

une fois ton traitement finit, te suffira de le killer.

c'est le plus simple et surtout le plus propre en VB6
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 mars 2010 à 13:55
en effet renfield, c'est bien avec un timer et des DoEvents que je le fait d'abitude.
mais la pas possible.
mais concidère que l'application travaille sur un fichier excel servant de "base de donnée" (c franchement moche mais je n'ai pas le choix, c'est une base qui existe depuis bien longtemps)

--> 40K lignes à traiter. les traitements mêmes pris séparément prennent plus de temps que voulu (en plus ce ne sont pas des bêtes de courses les machines qu'ont les utilisateurs ...)

et il n'y a pas que les actions excel. il y a aussi la copie en local du fichier (ca peut prendre du temps vu que le fichier est sur un reseau ...) etc

c'est pourquoi la solution du multithread pour l'animation me semblait pas mal ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 mars 2010 à 13:17
Qu'est-ce qui prend si longtemps ?
UNE opération Excel, ou l'enchainement de commandes de pilotage de Excel ?

parceuq esi tu colles des DoEvents dans ton code, ton thread peut très bien etre remplacé par un Timer qui mettra a jour ton animation...
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 mars 2010 à 13:08
Bonjour,
J'ai utilisé un thread comme ci dessus pour annimer un sablier pendant des traitements excel en VB6 (automation).
En effet, lors de certains traitements, le temps mis peut être long (pls 10 aines de secondes). Or, quand un traitement est long a faire, il faut rassurer l'utilisateur en lui metant sous le nez quelque chose qui montre qu'une tâche est bien en cours.

J'ai donc mon Apli qui instancie Excel et effectue des traitements. et un nouveau thread qui fait :
Public Function FNC_THREAD_1()
On Error GoTo erreur
'/!\ jamais de Doevents dans un thread hein ^^
Do
'faire tourner l'image
Current_Img = (Current_Img Mod frmQuBES.IMG.ListImages.Count) + 1
Set frmQuBES.I.Picture = frmQuBES.IMG.ListImages(Current_Img).Picture

'faire une pause
Sleep 250
Loop While True 'faire a l'infini

erreur:
Stop_Thread
End Function

avec
Private ThreadControl1 As clsThreading
Private Current_Img As Integer

Public Sub Start_Thread()
'Init variable
Current_Img = 1
Set frmQuBES.I.Picture = frmQuBES.IMG.ListImages(Current_Img).Picture

Dim mThreadPriority As Long
mThreadPriority = tpAboveNormal

Dim mEnabled As Boolean
mEnabled = True

'Creation du thread
Set ThreadControl1 = New clsThreading
ThreadControl1.CreateNewThread AddressOf FNC_THREAD_1, mThreadPriority, mEnabled
End Sub
Public Sub Stop_Thread()
ThreadControl1.TerminateCurrentThread
End Sub

le problème est le suivant :
en mode d'éxécution sous VBE tout se passe comme voule.Excel tourne et mon sablier tourne aussi.
en revanche, lorsque je génère l'executable (pas de probleme de compilation) et que je l'execute la ca ne marche plus. Le thread principal tourne normalement mais le thread d'annimation (thread ajouté) génère une popup "Violation d'accès en écriture...blablabla"
Et bien sur l'annimation ne marche pas.

pour information, la fenetre frmQuBES est en ShowModal 1

si une personne a une idée d'ou ca peut venir ...
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
23 oct. 2006 à 08:18
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é
l0st3d Messages postés 205 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 13 novembre 2009
22 oct. 2006 à 21:14
#1 t'a source. Merci beaucoup!
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 août 2004 à 11:41
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++
occhipin Messages postés 13 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 11 août 2004
2 août 2004 à 10:47
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
occhipin Messages postés 13 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 11 août 2004
30 juil. 2004 à 15:08
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" !!!
occhipin Messages postés 13 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 11 août 2004
30 juil. 2004 à 14:55
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
capoueidiablo Messages postés 316 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 1 février 2010 1
9 juil. 2004 à 16:16
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 [:)]
captaincav Messages postés 16 Date d'inscription vendredi 2 août 2002 Statut Membre Dernière intervention 18 janvier 2006
4 févr. 2004 à 10:18
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 :)
cs_heine Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 novembre 2006
16 janv. 2004 à 16:22
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...
cs_heine Messages postés 58 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 novembre 2006
23 juin 2003 à 15:47
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 ?
cs_gogomanu Messages postés 29 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 26 mars 2009
19 juin 2003 à 16:17
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 !
venomp Messages postés 1 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 11 mars 2003
11 mars 2003 à 09:32
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.
cs_bdufay Messages postés 11 Date d'inscription mercredi 13 mars 2002 Statut Membre Dernière intervention 29 mars 2006
16 janv. 2003 à 11:43
Nickel!
cs_Ouneufe Messages postés 60 Date d'inscription mardi 4 septembre 2001 Statut Membre Dernière intervention 19 janvier 2009
7 janv. 2003 à 12:56
Rhaaaaaa, enfin une demo de thread ciselée et complète. Ouh là, je me sens défaillir de bonheur. hop : 10/10
cs_TheDjinn Messages postés 10 Date d'inscription dimanche 5 mai 2002 Statut Membre Dernière intervention 10 novembre 2002
10 déc. 2002 à 22:52
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 ;)
cs_TheDjinn Messages postés 10 Date d'inscription dimanche 5 mai 2002 Statut Membre Dernière intervention 10 novembre 2002
2 déc. 2002 à 22:16
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'... ;)
bdpatrice Messages postés 11 Date d'inscription mardi 23 juillet 2002 Statut Membre Dernière intervention 1 juillet 2003
21 nov. 2002 à 16:54
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?
cs_jenlain Messages postés 2 Date d'inscription jeudi 25 avril 2002 Statut Membre Dernière intervention 28 octobre 2002
28 oct. 2002 à 18:48
ca marche pas, ton truc
couriousous Messages postés 68 Date d'inscription lundi 21 mai 2001 Statut Membre Dernière intervention 4 janvier 2003
2 oct. 2002 à 21:39
ok compris! ( named pipe? comme sous linux dans le shell?)
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
1 oct. 2002 à 19:13
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.
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
1 oct. 2002 à 19:09
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é !!!!
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
1 oct. 2002 à 19:08
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
couriousous Messages postés 68 Date d'inscription lundi 21 mai 2001 Statut Membre Dernière intervention 4 janvier 2003
1 oct. 2002 à 18:39
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!
couriousous Messages postés 68 Date d'inscription lundi 21 mai 2001 Statut Membre Dernière intervention 4 janvier 2003
1 oct. 2002 à 18:34
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?
cs_zmat Messages postés 13 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 29 octobre 2002
1 oct. 2002 à 14:53
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
cs_Mix78 Messages postés 1 Date d'inscription samedi 8 septembre 2001 Statut Membre Dernière intervention 1 octobre 2002
1 oct. 2002 à 09:30
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 :-)
cs_Crazyht Messages postés 1522 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 21 août 2010 8
1 oct. 2002 à 09:24
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
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
1 oct. 2002 à 01:43
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.......
cs_zmat Messages postés 13 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 29 octobre 2002
30 sept. 2002 à 23:41
Bsoir,
Juste une petite kestion : c koi un thread ? :-/
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
30 sept. 2002 à 12:27
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)
Rejoignez-nous