Aide sur bouton bloque par une api

Résolu
geoffrey54 Messages postés 3 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 30 septembre 2007 - 28 sept. 2007 à 15:38
geoffrey54 Messages postés 3 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 30 septembre 2007 - 30 sept. 2007 à 14:26
Salut a tous,

voila j'essaie de faire un programme permettant de savoir si des fichiers ont ete modifiés dans un dossier. Ca marche seulement mes boutons sont bloqués aprés. Voici mon code:

Private Sub Command1_Click()
 Dim Ret As Long
    'Set the notification hook
    Ret = FindFirstChangeNotification("C:\temp2", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL)
    flag = False
    'Wait until the event is triggered
    WaitForSingleObject Ret, &HFFFFFFFF
    MsgBox "Event Triggered for the first time"
    'Reactivate our hook
    Do While flag = False
    FindNextChangeNotification Ret
    'Wait until the event is triggered
    DoEvents
    WaitForSingleObject Ret, &HFFFFFFFF
    DoEvents
    MsgBox "Event Triggered for the second time"
    'Remove our hook
    Loop
    FindCloseChangeNotification Ret
End Sub

Private Sub Command2_Click()
flag = True
End Sub

En faite j'aimerais que lorsque je click sur le bouton 2 il arrete de surveiller le dossier mais impossible de clicker sur le 2eme bouton. Je pensait que l'instruction Doevent suffirait mais non.

Merci de votre aide.

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 sept. 2007 à 18:11
La solution serait aussi de ne pas mettre un délai d'attente infini pour WaitForSingleObject.

En mettant &HFFFFFFFF, tu indique un temps d'attente infini. Ce qui fait que ton programme reste bloqué sur l'instruction WaitForSingleObject tant que l'évènement correspondant à Ret ne sera pas déclenché. Et il peut retser ainsi bloqué des siècles.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
30 sept. 2007 à 10:04
ça doit être le premier WaitForSingleObject qui bloque encore. Il faut le remplacer aussi, et du coup, je pense que c'est plus simple de tout mettre dans la même boucle :

  Dim Ret As Long, Code As Long, i As Long
 
  'Set the notification hook
  Ret = FindFirstChangeNotification("C:\temp2", INFINITE, FILE_NOTIFY_CHANGE_ALL)
  flag = False
 
  'Cette boucle se termine quand l'utilisateur a annulé la surveillance
  DoEvents 'Il faut faire DoEvents avant MsgWaitForMultipleObjects
  Do Until flag = True 'Test du flag entre DoEvents et MsgWaitForMultipleObjects
    Code = MsgWaitForMultipleObjects(1, Ret, 0, INFINITE, QS_ALLINPUT)
    If Code = WAIT_OBJECT_0 Then
      'Il y a eu une modification
      i = i + 1
      MsgBox "Modification détectée (n° " & i & ")"
      'Fin du traitement, attend la modification suivante...
      FindNextChangeNotification Ret
    ElseIf Code = -1 Then
      MsgBox "Une erreur s'est produite"
      Exit Do
    End If
    DoEvents
  Loop
 
  FindCloseChangeNotification Ret 'Remove our hook
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 sept. 2007 à 16:36
Bonjour

DoEvents

cette instruction peut-être utile.

Balèse la personne qui a pensé au pansement à penser (ou à panser, pensée).
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
28 sept. 2007 à 17:28
Bonjour,

la solution est de remplacer WaitForSingleObject (bloquante) par MsgWaitForMultipleObjects qui s'arête lorsque la modification du fichier est faite OU lorsqu'un événement arrive dans l'application.

Do
  DoEvents
  If flag = true then Exit Do
Loop While MsgWaitForMultipleObjects(1, Ret, 0, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1
If flag = true then ... 'L'utilisateur a annulé
(Const WAIT_OBJECT_0 0, QS_ALLINPUT 255)
0

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

Posez votre question
geoffrey54 Messages postés 3 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 30 septembre 2007
29 sept. 2007 à 14:19
voila ce que j'ai mis:

Dim Ret As Long
    'Set the notification hook
    Ret = FindFirstChangeNotification("C:\temp2", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL)
    flag = False
 
    WaitForSingleObject Ret, &HFFFF
    MsgBox "Event Triggered for the first time"
   
    FindNextChangeNotification Ret
   
    Do
  DoEvents
  If flag = True Then Exit Do
    Loop While MsgWaitForMultipleObjects(1, Ret, 0, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1
    If flag = True Then MsgBox "L'utilisateur a annulé"

End Sub

Private Sub Command2_Click()
flag = True
End Sub

voila ce que j'ai mis mais il y a une erreur qui fait tout planter...
les deux autres solutions ne marchent pas puisque DoEvents je l'avais deja mis et le fait de raccourcir le temps ne change me permet d'appuyer mais le programme ne fait pas ce que je veux...

merci encore de votre aide.
0
geoffrey54 Messages postés 3 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 30 septembre 2007
30 sept. 2007 à 14:26
C bon j'ai fait un mix des deux reponses:

  DoEvents 'Il faut faire DoEvents avant MsgWaitForMultipleObjects
  Do Until flag = True 'Test du flag entre DoEvents et MsgWaitForMultipleObjects
    Code = WaitForSingleObject(Ret, &HFF)
    If Code = WAIT_OBJECT_0 Then
      'Il y a eu une modification
      i = i + 1
      MsgBox "Modification détectée (n° " & i & ")"
      'Fin du traitement, attend la modification suivante...
      FindNextChangeNotification Ret
    ElseIf Code = -1 Then
      MsgBox "Une erreur s'est produite"
      Exit Do
    End If
    DoEvents
  Loop

J'ai remplacé MSGwaitblabla par WaitForSingleObject et j'ai reuduit la duree.

Merci encore de votre aide.
0
Rejoignez-nous