Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1363 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1405308
zeOffsprin​g
Posté le 12-07-2006 à 10:50:19  profilanswer
 

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:

mood
Publicité
Posté le 12-07-2006 à 10:50:19  profilanswer
 

n°1405312
jpcheck
Pioupiou
Posté le 12-07-2006 à 10:53:52  profilanswer
 

un bouton avec un .cancel ?

n°1405321
zeOffsprin​g
Posté le 12-07-2006 à 11:01:31  profilanswer
 

jpcheck a écrit :

un bouton avec un .cancel ?


c'est à dire ?

n°1405326
jpcheck
Pioupiou
Posté le 12-07-2006 à 11:04:25  profilanswer
 

zeOffspring a écrit :

c'est à dire ?


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

n°1405336
zeOffsprin​g
Posté le 12-07-2006 à 11:14:32  profilanswer
 

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...

n°1405337
Paul Hood
Posté le 12-07-2006 à 11:14:58  profilanswer
 

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.

n°1405359
zeOffsprin​g
Posté le 12-07-2006 à 11:26:09  profilanswer
 

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

n°1405491
tegu
Posté le 12-07-2006 à 12:57:42  profilanswer
 

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.

n°1405634
zeOffsprin​g
Posté le 12-07-2006 à 15:07:26  profilanswer
 

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
n°1405642
jpcheck
Pioupiou
Posté le 12-07-2006 à 15:11:28  profilanswer
 

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

mood
Publicité
Posté le 12-07-2006 à 15:11:28  profilanswer
 

n°1405643
tegu
Posté le 12-07-2006 à 15:16:08  profilanswer
 

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).

n°1405666
zeOffsprin​g
Posté le 12-07-2006 à 15:31:56  profilanswer
 

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
n°1405671
jpcheck
Pioupiou
Posté le 12-07-2006 à 15:35:58  profilanswer
 

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

n°1405674
zeOffsprin​g
Posté le 12-07-2006 à 15:38:25  profilanswer
 

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

n°1405682
tegu
Posté le 12-07-2006 à 15:44:49  profilanswer
 

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
n°1405688
zeOffsprin​g
Posté le 12-07-2006 à 15:50:19  profilanswer
 

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
n°1405706
Paul Hood
Posté le 12-07-2006 à 16:04:49  profilanswer
 

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.

n°1405738
zeOffsprin​g
Posté le 12-07-2006 à 16:47:49  profilanswer
 

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 ?

n°1406088
les gens r​oots
Jah rastafarei
Posté le 13-07-2006 à 08:39:22  profilanswer
 

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:

n°1406414
zeOffsprin​g
Posté le 13-07-2006 à 15:12:11  profilanswer
 

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  :(

n°1406474
les gens r​oots
Jah rastafarei
Posté le 13-07-2006 à 15:56:12  profilanswer
 

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é

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
Automatiser fonction d'envoi de mails via siteaffiche une page ou en autre en fonction d'une condition
Pause durant l'éxecution d'un MSI...fonction TRONQUE résolu
Probleme avec la fonction DATACHANGEDincompréhension avec la fonction Instr
Fonction remplacement ne fonctionne pas !fonction dans un lien php
Fonction qui retourne une collection d'objets[SGDB] PL/SQL : Fonction qui retourne un curseur
Plus de sujets relatifs à : [VB] Arrêter l'exécution d'une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR