IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

QueryUnload pas vu malgré DoEvents


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut QueryUnload pas vu malgré DoEvents
    Bonjour à tous !

    Avant, ça marchait, et puis ça marche plus !

    J'ai fait un programme qui appelle des routines API qui se déroulent dans d'autres threads. Je boucle donc pour tester les indicateurs de fin, et, bien sûr, il y a des DoEvents dans ces boucles. Et si, depuis l'environnement de développement, je mets soudain un point d'arrêt sur ces DoEvents, je m'y arrête bien.

    Mon programme de Form comporte une routine Form_QueryUnload. Si je ne suis pas encore rentré dans ces boucles d'appels d'API, et que je clique sur la croix en haut à droite, je sors bien de mon programme. Mais à partir du moment où je suis rentré dedans, je n'entre plus dans Form_QueryUnload et la croix ne répond plus.

    Avant, ça marchait. J'ai fait des modifs tout à fait ailleurs dans le programme, et maintenant, ça ne marche plus ????

    Bien sûr, vous allez me demander du code et tout et tout. Ce n'est pas par ce que je veux garder mes secrets, mais je crois que c'est beaucoup trop compliqué. Je ne demande pas que l'on résolve mon problème, je voudrais juste que quelqu'un me donne des idées générales sur où chercher, est-ce que c'est un problème connu, tout ça...

    Merci d'avance.

    AMIcalement.

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Eh bien, ça na se précipite pas pour répondre...

    J'apporte un élément nouveau : j'ai ajouté un bouton Stop dans ma form, et j'y exécute exactement le même code (recopie) que dans la routine Form_QueryUnload. Et ça marche.

    J'en déduis que, dans mes conditions d'utilisation, DoEvents ne "voit" pas l'appui sur la croix System.

    Étonnant, non ?

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut
    Avant, ça marchait........
    Si je ne suis pas encore rentré dans ces boucles d'appels d'API...........je sors bien de mon programme.
    J'ai fait des modifications tout à fait ailleurs dans le programme, et maintenant, ça ne marche plus ????
    Sans mettre tout ton code, il serait intéressant de mettre un exemple d'une de ces boucles d'appel d'API,
    même si cela n'est pas dans l'une des boucles que tu as fait des modifications.
    D'ailleurs, les modifications sont elles sur la même Form que le QueryUnload qui te semble ne plus fonctionner?

    Il est parfois très dur de sortir d'une boucles Do......Loop , même avec un Doevents ,
    il faut parfois mettre une condition interne à la boucle pour pouvoir la quitter.

    Un exemple ou j'ai rajouté un drapeau de sortie de boucle en plus que la condition Until
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
    Dim ArretProg As Boolean
     
    Public Function Cas1(Arc As Double, Corde As Double) As Double
    Dim objPic As Picture
    Dim X As Double, BuT As Double, V As Double
    BuT = Round((C / S), 7): X = 0.1
     
    '.......................................
    Set objPic = PictCoulFond.Image  'Chargement de l'objet modèle
    Do
        X = X + 0.0000001: V = Sin(X) / X: DoEvents
        If ArretProg Then Exit Do
    Loop Until V <= BuT
    '.......................................
    '.......................................
    Set objPic = Nothing 'libération mémoire
    '.......................................
    End Function
     
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ArretProg = True
    End Sub
    Dans mon cas, je sort par un Exit DO et non pas un Exit Function , ce qui permet de libérer la mémoire et la liaison à l'objet PictCoulFond
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Voici donc le code de cette routine, brut de fonderie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Public Sub Capture()
        Static Wave(1) As WaveHdr, b As Integer, ncycle As Integer
        For b = 0 To 1
            Wave(b).lpData = VarPtr(InData(0, b))
            Wave(b).dwBufferLength = LInData
            Wave(b).dwFlags = 0
        Next
    ' Premier remplissage du premier buffer
        b = 0
        waveInPrepareHeader DevHandle(b), VarPtr(Wave(b)), Len(Wave(b))
        waveInAddBuffer DevHandle(b), VarPtr(Wave(b)), Len(Wave(b))
        QueryPerformanceCounter td(0)
        t0 = td(0)
        'attend le remplissage du buffer
        Do
           DoEvents
        Loop Until ((Wave(b).dwFlags And WHDR_DONE) = WHDR_DONE) Or DevHandle(b) = 0
    ' on entre dans la boucle où le remplissage d'un buffer se fait pendant le traitement de l'autre
        b = 1
        ncycle = 0
        Do
            QueryPerformanceCounter t
            ncycle = ncycle - 1
            Do ' on cherche dans quel cycle de même parité on se trouve
                ncycle = ncycle + 2
                DoEvents
            Loop Until t < t0 + ncycle * Périodeperf
            Do ' on attend la fin de ce cycle
                QueryPerformanceCounter t
                DoEvents
            Loop While t < t0 + ncycle * Périodeperf
            DoEvents
            waveInPrepareHeader DevHandle(b), VarPtr(Wave(b)), Len(Wave(b))
            waveInAddBuffer DevHandle(b), VarPtr(Wave(b)), Len(Wave(b))
            QueryPerformanceCounter td(b)
            Form1.Nocycle = ncycle
            Form1.Tmps = 1000 * (td(b) - t0) / freq
            'traite l'autre buffer
            traite (1 - b)
            'Positionne ce qu'il faut pour ré-utiliser le buffer
            DoEvents
            waveInUnprepareHeader DevHandle(1 - b), VarPtr(Wave(1 - b)), Len(Wave(1 - b))
            'attend le remplissage du buffer (précaution)
            Do
               DoEvents
            Loop Until ((Wave(b).dwFlags And WHDR_DONE) = WHDR_DONE) Or DevHandle(b) = 0
            DoEvents
            If DevHandle(b) = 0 Then Exit Do   ' signal de sortie de la boucle
            b = 1 - b
         Loop While DevHandle(b) <> 0
    End Sub
    J'ai trouvé sur la toile un code qui récupérait le buffer de capture du signal du micro. Je l'ai adapté pour faire un flip-flop avec deux buffers, je traite l'un pendant que l'autre se remplit dans son thread.

    Si c'est là que le loup se cache, je n'ai pas la compétence pour le dénicher.

    Merci d'avance.

    AMIcalement.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/10/2010, 12h35
  2. [1.x] pgsql n'est pas reconnu malgré l'installation
    Par manu f dans le forum Symfony
    Réponses: 1
    Dernier message: 16/03/2010, 14h38
  3. tdbedit pas readonly malgré datasource en dsBrowse
    Par didiergm dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/09/2009, 19h15
  4. [MySQL] Antislashs pas enregistrés malgré addslashes()
    Par Jarodd dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/12/2008, 12h43
  5. Réponses: 2
    Dernier message: 05/10/2006, 08h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo