[VB] Arrêter l'exécution d'une fonction

Arrêter l'exécution d'une fonction [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 12-07-2006 à 10:50:19    

Salut
J'ai une feuille avec un bouton "Lancer" et une bouton "Annuler"
 
Le bouton "Lancer" effectue de nombreuses choses : ouvre Word, fait du traitement dedans, écrit sur le disque, envoie des mails, des fax et des SMS...
Suivant les paramètres, cette exécution peut être longue, très longue.
L'utilisateur peut aussi se rendre compte d'une erreur et peut vouloir stopper l'exécution de la procédure.
 
Le bouton "Annuler" sert à ça mais je ne sais pas quoi mettre dedans....
Comment stopper l'exécution d'une fonction à partir d'une autre ?
 
Je suis clair au moins ??  :pt1cable:  
 
Merci d'avance les gars  :hello:

Reply

Marsh Posté le 12-07-2006 à 10:50:19   

Reply

Marsh Posté le 12-07-2006 à 10:53:52    

un bouton avec un .cancel ?

Reply

Marsh Posté le 12-07-2006 à 11:01:31    

jpcheck a écrit :

un bouton avec un .cancel ?


c'est à dire ?

Reply

Marsh Posté le 12-07-2006 à 11:04:25    

zeOffspring a écrit :

c'est à dire ?


le .cancel ne s'appliquant pas  finalement à ce dont je pensais, essaie avec un application.quit ^^

Reply

Marsh Posté le 12-07-2006 à 11:14:32    

wé mais j'ai pas envie que ça ferme mon application en fait
cette feuille est une feuille enfant dans une MDI et je ne veux pas qu'en cliquant sur "Annuler" que ça ferme
quoi que ce soit, seulement que l'exéuction de la procédure stoppe...

Reply

Marsh Posté le 12-07-2006 à 11:14:58    

Tant que l'action liée au boton "lancer" n'est pas terminée, l'événement sur le bouton "annuler" n'est pas pris en compte sauf si tu arrives  à faire excécuter ton "lancer" en tache de fond.

Reply

Marsh Posté le 12-07-2006 à 11:26:09    

Paul Hood a écrit :

Tant que l'action liée au boton "lancer" n'est pas terminée, l'événement sur le bouton "annuler" n'est pas pris en compte sauf si tu arrives  à faire excécuter ton "lancer" en tache de fond.


 
wahou c'est la merde ça
y'a pas moyen de faire ce que je veux avec les évènements ? je connais pas trop ça
si quelqu'un peut m'en parler, u're welcome

Reply

Marsh Posté le 12-07-2006 à 12:57:42    

Il y a la possiblité de mettre l'instruction DoEvents dans ton traitement (surtout si c'est une boucle), qui permet de gérer l'événement de clic sur le bouton Annuler (en principe).
Après il te suffit d'avoir un test If sur une variable booléenne dans ton traitement et de l'initialiser sur clic de Annuler. Ça c'est la théorie et ça ne marche pas toujours comme ça devrait.
Une autre possibilité bien plus complexe (hasardeuse ?) serait de gérer du multithreading en vb (1 thread pour le traitement, un autre pour l'événement annuler), mais je ne m'avancerais pas plus à ce sujet.

Reply

Marsh Posté le 12-07-2006 à 15:07:26    

tegu a écrit :

Il y a la possiblité de mettre l'instruction DoEvents dans ton traitement (surtout si c'est une boucle), qui permet de gérer l'événement de clic sur le bouton Annuler (en principe).
Après il te suffit d'avoir un test If sur une variable booléenne dans ton traitement et de l'initialiser sur clic de Annuler. Ça c'est la théorie et ça ne marche pas toujours comme ça devrait.
Une autre possibilité bien plus complexe (hasardeuse ?) serait de gérer du multithreading en vb (1 thread pour le traitement, un autre pour l'événement annuler), mais je ne m'avancerais pas plus à ce sujet.


 
ouais du multi thread j'y ai pensé mais pareil je n'y connais pas grand chose...
si quelqu'un veut nous en parler un peu plus ici ça pourrait le faire  :jap:  
 
sinon j'ai implémenté ce que tu as dit, ça donne ça et ça ne fonctionne pas. Ai-je oublié quelque chose ?
Merci
 

Citation :

Dim annuler As Boolean
 
...
 
 
Private Sub Form_Load()
 
    '...
    annuler = False
    '...
 
End Sub
 
 
Private Sub cmdAnnuler_Click()
 
    annuler = True
 
End Sub
 
 
Private Sub cmdLancer_Click()
 
    '...
 
    annuler = False
 
    'Si le client a actionné le bouton d'annulation
    If annuler = True Then
        If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
            MsgBox ("Mailing annulé par l'utilisateur." )
            Exit Sub
        End If
    End If

    DoEvents
 
    '...
 
End Sub

Message cité 1 fois
Message édité par zeOffspring le 12-07-2006 à 15:08:08
Reply

Marsh Posté le 12-07-2006 à 15:11:28    

zeOffspring a écrit :

   
 
Private Sub cmdLancer_Click()
 
    '...
 
    annuler = False
 
    'Si le client a actionné le bouton d'annulation
    If annuler = True Then
        If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
            MsgBox ("Mailing annulé par l'utilisateur." )
            Exit Sub
        End If
    End If

    DoEvents
 
    '...
 
End Sub[/quote]


tu ne passeras jamais dans ta boucle si tu mets annuler à false dans ta sub... ca ne pourra pas fonctionner

Reply

Marsh Posté le 12-07-2006 à 15:11:28   

Reply

Marsh Posté le 12-07-2006 à 15:16:08    

Si ton traitement n'inclut pas de boucle, il ne fera le test du booléen qu'une fois. Alors le résultat est aléatoire suivant si tu annules tôt ou tard.
Cela dépend aussi de la lenteur du reste de ton traitement.
Il faut aussi envisager de mettre plusieurs DoEvents à des endroits stratégiques, suivant la nature de ton code.
 
En gros DoEvents rend la main au process de gestion des messages de l'OS. Et si dans sa pile de messages en attente il voit un événement du type clic sur un bouton, alors il le traite plutôt que de continuer de suite son traitement. Mais si aucun message n'est en attente, il revient à la suite  du traitement en cours (après le DoEvents).

Reply

Marsh Posté le 12-07-2006 à 15:31:56    

alors... j'ai enlevé le annuler = false de la sub et j'ai fait ça :
(déso pour la tonne de code)
 
 

Code :
  1. Private Sub cmdLancer_Click()
  2.     Dim rstClientFax As DAO.Recordset
  3.     Dim rstClientSMS As DAO.Recordset
  4.     Dim IndexMail As Integer
  5.     Dim IndexFax As Integer
  6.     Dim IndexSMS As Integer
  7.     Dim i As Integer
  8.     On Error Resume Next
  9.     cmdFermer.Enabled = False
  10.     cmdAnnuler.Visible = True
  11.     'Si le client a actionné le bouton d'annulation
  12.     If annuler = True Then
  13.         If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
  14.             MsgBox ("Mailing annulé par l'utilisateur." )
  15.             Exit Sub
  16.         End If
  17.     End If
  18.     DoEvents
  19.     'ENVOI DU MAIL GROUPE AUX NbClientsMail DESTINATAIRES
  20.     If NbClientsMail <> 0 Then
  21.         'Création de la liste des destinataires
  22.         Dim list_dest As String
  23.         For IndexMail = 0 To NbClientsMail - 2
  24.             list_dest = list_dest & TabDestMail(IndexMail).Coordonnee & ","
  25.         Next IndexMail
  26.         list_dest = list_dest & TabDestMail(NbClientsMail - 1).Coordonnee
  27.         'Chargement de la page d'envoi du mail
  28.         If cboType.ListIndex = 0 Then Call mailfr.ChargerMail(list_dest, 1, txtObjet.text)
  29.         If cboType.ListIndex = 1 Then Call mailfr.ChargerMail(list_dest, 2, txtObjet.text,)
  30.         Call mailfr.cmdGenerer_Click
  31.         'On attache les fichiers au mail
  32.         mailfr.nbFileAttachMail = Me.lstFiles.ListItems.Count
  33.         For i = 0 To mailfr.nbFileAttachMail - 1
  34.             Call mailfr.RemplirTabFichiersJoints(i, Me.lstFiles.ListItems(i + 1).SubItems(1), Me.lstFiles.ListItems(i + 1).SubItems(4), Me.lstFiles.ListItems(i + 1).SubItems(3))
  35.             mailfr.nbSizeFileAttach = mailfr.nbSizeFileAttach + Me.lstFiles.ListItems(i + 1).SubItems(4) / 1024
  36.         Next i
  37.         'Envoi du mail
  38.         Call mailfr.cmdEnvoyer_Click
  39.         Call mailfr.cmdFermer_Click
  40.         Wait 2
  41.         'Si le client a actionné le bouton d'annulation
  42.         If annuler = True Then
  43.             If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
  44.                 MsgBox ("Mailing annulé par l'utilisateur." )
  45.                 Exit Sub
  46.             End If
  47.         End If
  48.         DoEvents
  49.     End If
  50.     'ENVOI DES FAX, OUVERTURE DE LA FEUILLE FAX.FRM NbClientsFax FOIS
  51.     If NbClientsFax <> 0 Then
  52.         For IndexFax = 1 To NbClientsFax
  53.             'On récupère les données pour l'envoi et on charge la page des fax
  54.             Set rstClientFax = dba.OpenRecordset("SELECT * FROM Client WHERE [Code Client]=" & TabDestFax(IndexFax - 1).CodeClient)
  55.             Call Fax.ChargerFax(rstClientFax!Société, rstClientFax!Contact1, rstClientFax!Fax, rstClientFax!)
  56.             'On joint les pièces
  57.             For i = 1 To Me.lstFiles.ListItems.Count
  58.                 Fax.lstPJ.AddItem Me.lstFiles.ListItems(i).SubItems(3)
  59.             Next i
  60.             'Envoi du fax
  61.             Call Fax.cmdEnvoyer_Click
  62.             Call Fax.cmdFermer_Click
  63.             'Si le client a actionné le bouton d'annulation
  64.             If annuler = True Then
  65.                 If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
  66.                    MsgBox ("Mailing annulé par l'utilisateur." )
  67.                    Exit Sub
  68.                 End If
  69.            End If
  70.            DoEvents
  71.         Next IndexFax
  72.     End If
  73.     'ENVOI DES SMS, OUVERTURE DE LA FEUILLE SMS.FRM NbClientsSMS FOIS
  74.     If NbClientsSMS <> 0 Then
  75.         For IndexSMS = 1 To NbClientsSMS
  76.             Set rstClientSMS = dba.OpenRecordset("SELECT * FROM Client WHERE portable LIKE '" & TabDestSMS(IndexSMS - 1).Coordonnee & "'" )
  77.             Call SMS.ChargerSms(rstClientSMS!Contact1, TabDestSMS(IndexSMS - 1).Coordonnee)
  78.             Call SMS.BTenvoyer_Click
  79.             Call SMS.cmdFermer_Click
  80.             'Si le client a actionné le bouton d'annulation
  81.             If annuler = True Then
  82.                 If MsgBox("Etes-vous sûr(e) de vouloir annuler le mailing ?", vbYesNo) = vbYes Then
  83.                     MsgBox ("Mailing annulé par l'utilisateur." )
  84.                     Exit Sub
  85.                 End If
  86.             End If
  87.             DoEvents
  88.         Next IndexSMS
  89.     End If
  90.     cmdAnnuler.Visible = False
  91.     cmdFermer.Enabled = True
  92.     cmdLancer.Enabled = False
  93.     MsgBox ("Le mailing est terminé." )
  94. End Sub


Message édité par zeOffspring le 12-07-2006 à 15:37:06
Reply

Marsh Posté le 12-07-2006 à 15:35:58    

est-ce que ca a au moins le mérite de tourner ??  :pt1cable:

Reply

Marsh Posté le 12-07-2006 à 15:38:25    

jpcheck a écrit :

est-ce que ca a au moins le mérite de tourner ??  :pt1cable:


of course dude
seulement l'annulation ne fonctionne pas
tu me prends pour qui ? :p

Reply

Marsh Posté le 12-07-2006 à 15:44:49    

Déjà sur le principe il faudrait mettre le DoEvents avant le test If annuler...

Message cité 1 fois
Message édité par tegu le 12-07-2006 à 15:45:06
Reply

Marsh Posté le 12-07-2006 à 15:50:19    

tegu a écrit :

Déjà sur le principe il faudrait mettre le DoEvents avant le test If annuler...


en fait c ce que je demande depuis le début
c la première fois que je m'en sers  ;)
sinon ça va ?


Message édité par zeOffspring le 12-07-2006 à 15:54:57
Reply

Marsh Posté le 12-07-2006 à 16:04:49    

http://frederic.sigonneau.free.fr/ [...] 7_2000.txt
Un site très interessant et notamment pour le timer.
Ca permet d'éxecuter un code toutes les xx secondes. Si ton bouton est appuyer par exemple.

Reply

Marsh Posté le 12-07-2006 à 16:47:49    

Paul Hood a écrit :

http://frederic.sigonneau.free.fr/ [...] 7_2000.txt
Un site très interessant et notamment pour le timer.
Ca permet d'éxecuter un code toutes les xx secondes. Si ton bouton est appuyer par exemple.


hum hum et sinon ?

Reply

Marsh Posté le 13-07-2006 à 08:39:22    

Bonjour à tous, notament à l'auteur de ce topic qui a l'air de galérer :hello:. J'ai un peu d'expérience en multithreading sous VB.NET si ça peu t'aider... Pose des questions j'y répondrai avec plaisir :bounce:

Reply

Marsh Posté le 13-07-2006 à 15:12:11    

les gens roots a écrit :

Bonjour à tous, notament à l'auteur de ce topic qui a l'air de galérer :hello:. J'ai un peu d'expérience en multithreading sous VB.NET si ça peu t'aider... Pose des questions j'y répondrai avec plaisir :bounce:


 
salut  :hello:  
et en VB tout court ?
En fait je sais meme pas comment implémenter ça, je n'y connais vraiment rien  :(

Reply

Marsh Posté le 13-07-2006 à 15:56:12    

J'avoue que je ne sais même pas déclarer un Thread en VB ^^. J'ai juste vu quelques bouts de code sur ce langage qui n'utilisaient pas de system de Thread. Donc j'ai bien peur de ne pas pouvoir t'aider en VB
=(. Désolé

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed