[VB6] Multi-Threading - Stopper le 'Main'

badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   -  
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je code en VB6 et j'arrive à lancer, à partir de la fonction Main de mon programme, un thread (un pour commencer).

Mon problème est le suivant :
Une fois le thread lancé, il se termine et tue aussi la fonction main. J'ai essayé d'utiliser un sleep mais cela stoppe le main et le thread (tous les processus ...).

Y a-t-il quelque chose permettant de stopper le 'main' et que celui-ci reprend son exécution quand le thread (voir un thread en particulier quand il y en aura plusieurs lancés) a terminé.

J'attends vos réponses, c'est assez urgent.
Merci.
Badside ;)

9 réponses

xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
Tu as envisager la possibilite des semaphores?
je ne sais pas si c adapte a ton prbm mais c plus simple que les thread en fonctionnement!
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Je dois d'abord savoir ce que sont des semaphores et comment ça fonctionne :) ...

J'ai pas trop le temps en fait.
Je me heurte à ce problème alors que tout le reste fonctionne. Je suis presque près de la fin ...
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Personne ???

Il me faudrait une fonction comme 'wait' en C mais qui fonctionne en VB6.
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
Tu veux faire quoi pendant l'arret de ton main?
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Exécuter le thread lancé.

Puis quand celui-ci a fini, le main se relance.
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
oui mais ton thread il fais quoi?
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Ca a une importance ?

Il fait des calculs et traitements sur une DB : update, insert, delete et lancement de stored procedures ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour tous,
En VB6 il n'y a pas de possibilité de faire du MultiTread, sauf avec un Exe ActiveX qui est fort limité.
Mais tu peu lancer plusieurs actions en différer
Pour remplacer le Wait faire une boucle avec des semaphores (drapeau, variables)


Public Att1 As Boolean
Public Att2 As Boolean


Sub Lancer2Actions()
    Call Lancer1
    Call Lancer2
End Sub

Sub Lancer1()
    While Att1 = False
        'Faire action1 ou code
        'ou ne rien faire simplement attendre que Att1 passe à True
        DoEvents
    Wend
End Sub
Sub Lancer2()
    While Att2 = False
        'Faire action2 ou code
        'ou ne rien faire simplement attendre que Att2 passe à True
        'Condition remplie !! Att2=true / tue le processus 2
        DoEvents
    Wend
    Att1 = True 'Tue le processus 1
End Sub

Une approche pour faire 2 actions ""en même temps""
A+
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Ok, merci lermite222. Je vais tester après car j'ai vu un autre problème dans l'appel à la fonction CreateThread() permettant de lancer le thread : apparemment, il ne passe pas le paramètre que je veux ... Je fais :

ll_MHandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf ThreadPerfo2, li_IDThread, 0, ll_IpThreadID)

li_IDThread est le paramètre que je veux passer. La valeur est correcte lors du lancement du thread (appel à la fonction CreateThread) mais une fois dans le thread, j'ai une valeur qui n'a rien à voir ...

Des idées ? Me suis-je trompé dans la syntaxe ?
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4 > badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention  
 
bon, le passage de paramètre, j'ai trouvé :

ll_MHandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf ThreadPerfo2, li_IDThread, 0, ll_IpThreadID)

à remplacer par :

ll_MHandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf ThreadPerfo2, Byval li_IDThread, 0, ll_IpThreadID)
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
L'ennui avec cette solution c'est que je ne peux pas utiliser de variable publique.
Je lance plusieurs threads en même temps (processus différents exécutant le même code). Si j'utilise une variable publique, celle-ci passera un "true" quand un thread aura fini mais les autres threads n'ont pas fini ... La variable publique pour eux devrait être à "false".
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Employer autant de variable qu'il y a de tread !
Et par exemple pour 2 trhead.

   While not (Att1 or Att2)
        'Faire action1 ou code
        'ou ne rien faire simplement attendre que Att1 et Att2 passe à True
        DoEvents
    Wend

?
A+
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Sauf que tous les threads utilisent le même code donc, je ne peux pas mettre plusieurs variables. Ca servirait à rien : si l'une devient true, les autres aussi.

(Dans le code du thread, à la fin de la fonction, je ne peux mettre qu'une variable.)
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
Tu es obligé d'utiliser des thread pour faire ce que tu veux?
0
badside Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
Bé, j'avais démarré avec ça en me disant que ce serait une bonne solution.
Je n'ai plus vraiment le temps de refaire tout le code surtout que je pensais que j'étais proche de la fin.

Maintenant, si ça ne va vraiment pas, je ferai ça avec des batchs ... :(
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Désolé mais là je ne te comprend plus bien, tu peu envoyer tes fonctions dll et quand une a fini mettre sont drapeau à true, le "Main" ne ceessera que quand tout les drapeux seront à True. ?
0