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

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 ;)
Configuration: Windows XP
Internet Explorer 7.0

9 réponses

  1. 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
    1. 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
  2. Personne ???

    Il me faudrait une fonction comme 'wait' en C mais qui fonctionne en VB6.
    0
    1. Tu veux faire quoi pendant l'arret de ton main?
      0
      1. Exécuter le thread lancé.

        Puis quand celui-ci a fini, le main se relance.
        0
    2. oui mais ton thread il fais quoi?
      0
      1. Ca a une importance ?

        Il fait des calculs et traitements sur une DB : update, insert, delete et lancement de stored procedures ...
        0
    3. Contributeur
      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
      1. 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
      2. @badsidebon, 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
      3. 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
    4. Contributeur
      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
      1. 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
    5. Tu es obligé d'utiliser des thread pour faire ce que tu veux?
      0
      1. 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
    6. Contributeur
      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