none
Interrompre une boucle de calcul RRS feed

  • Question

  • Bonjour,

    Je souhaite donner à l'utilisateur de mon logiciel de calcul la possibilité d'interrompre une boucle de calcul.

    Cette boucle est constituée par un enchaînement Do... Loop Until... (Il y a une boucle principale et plusieurs boucles intermédiaires).

    Les boucles portent sur des calculs par itération. On assigne à une des variables une valeur x, et on calcule la fonction y=f(x). Si la valeur obtenue n'est pas satisfaisante (ne répond pas à un critère de comparaison) on incrémente la valeur de x d'une petite valeur (le pas d'itération) et on recommence le calcul. Or, dans certains cas, l'itération diverge, c'est à dire que la valeur y s'éloigne de la valeur souhaitée au lieu de s'en rapprocher. Dans d'autres cas (c'est celui pour lequel j'ai besoin de votre assistance) le calcul se prolonge parce que la valeur du pas est trop petite. A titre d'information, il est courant dans mon logiciel que certaines itérations atteignent plusieurs centaines de millions de parcours de la boucle de calcul pour finalement aboutir au résultat souhaité.

    En fait, je donne les explications ci-dessus uniquement dans un but informatif. Elles ne sont pas nécessaires dans la résolution de mon problème. Ce que je cherche, c'est un moyen simple (un clic sur un bouton par exemple) pour que l'utilisateur interrompe la boucle de calcul. La solution avec VB6 était de mettre un drapeau (oui / non) par le bouton d'arrêt, et de forcer le système à examiner la position du drapeau au moyen de la commande DoEvents. Celle-ci n'existe plus sur vb.net.

    Quelqu'un pourrait-il m'aider ?


    Pierre Allemand

    vendredi 11 mai 2012 13:04

Réponses

Toutes les réponses

  • Salut,

    tu peux toujours mettre le flag

    mais seulement tu dois l'ajouter a ta condition exemple:

    dim flag as boolean = false

    do

    'ici le code a executer

    loop until (ta condition) or flag=true

    et dans la procedure click de ton bouton arret tu fais:

    flag=true


    la FOI déplace les montagnes et bien DOTNET les effaces complétement.

    vendredi 11 mai 2012 13:50
  • et de forcer le système à examiner la position du drapeau au moyen de la commande DoEvents. Celle-ci n'existe plus sur vb.net.

    Quelqu'un pourrait-il m'aider ?


    Pierre Allemand

    Bonjour,

    mais si, ca existe encore:

    Application.DoEvents


    Regards, Nico


    vendredi 11 mai 2012 14:09
  • Merci beaucoup Nico.

    Pierre Allemand

    vendredi 11 mai 2012 15:00
  • Désolé, mais ça ne marche pas sans le Application.DoEvents signalé par Nico.

    Pierre Allemand

    vendredi 11 mai 2012 15:05
  • Bonjour,

    Cela reste un peu périlleux comme indiqué par la rubrique "Attention" de la documentation : http://msdn.microsoft.com/fr-fr/library/system.windows.forms.application.doevents.aspx

    Une autre façon de faire serait d'utiliser un BackgroundWorker qui est spécialement conçu pour faire des traitements d'arrière plan en pouvant signaler les progrès du calcul et en supportant une annulation éventuelle des calculs (mais il faut effectivement se familiariser avec)...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 11 mai 2012 15:48
    Modérateur
  • J'avais effectivement lu, pour résoudre mon problème général de calcul, le chapitre intitulé "vue d'ensemble de la programmation asynchrone". N'étant pas familier du tout avec les BeginNomOpération et EndNomOpération qui ne ressemblent pas au langage vb classique, j'ai laissé provisoirement de coté. mais, je vais y revenir, car selon les cas, mes calculs peuvent avoir des comportements très différents. 



    Pierre Allemand

    vendredi 11 mai 2012 22:56
  • Bonjour Pierre,

    Ça peut mieux fonctionner si tu écris :

    My.Application.DoEvents()
    

    Cordialemeent.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    samedi 12 mai 2012 00:16