Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 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 | | | Calendrier |
|
| | Interrompre une tâche | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7095 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Interrompre une tâche Ven 14 Oct 2011 - 14:44 | |
| Je pense que la question a déjà été posée (plusieurs fois ?), j'ai recherché, pas trouvé. Mon problème est celui-ci: le programme est en train d'exécuter une boucle que je voudrais pouvoir interrompre sur appui d'une touche par l'utilisateur s'il trouve que c'est trop long (ou n'importe quoi d'autre).
Concrètement, j'ai un sous-programme qui parcourt un fichier binaire à l'aide d'une boucle dans laquelle est effectuée un certain traitement. Mais ce fichier binaire peut être très gros. Alors j'ai essayé: - une touche STOP, et dans la boucle je teste si la touche a été cliquée (IF CLICKED...), mais c'est sans effet, le clic sur la touche n'est détecté qu'à la fin de la boucle, en sortie du sous-programme. - un TIMER, avec positionnement d'un indicateur si la touche a été cliquée et test de cet indicateur dans la boucle. Même punition, même motif, le clic sur la touche n'est pas détecté pendant la boucle. C'est même pire, si on clique plusieurs fois pendant l'exécution on a 'Panoramic ne répond pas...' et ça finit par planter le programme à la sortie.
Quelqu'un connaît-il un moyen de résoudre ce problème ? | |
| | | Nardo26
Nombre de messages : 2294 Age : 55 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Interrompre une tâche Ven 14 Oct 2011 - 16:17 | |
| Bonjour JL35 ! Petite question : ton sous-programme est déclenché par lui-même par un évènement ?
| |
| | | Invité Invité
| Sujet: Re: Interrompre une tâche Ven 14 Oct 2011 - 16:30 | |
| Bonjour, Heureux de te revoir Nardo. @JL35 est-ce que ceci te convient. - Code:
-
label arret ,procedure , bouton dim a , passage memo 1 form 10:left 10,500:hide 10 memo 11:parent 11,10 button 12:parent 12,10:left 12,100:top 12,100:caption 12,"continu":on_click 12,bouton
timer 5:timer_interval 5,200 : on_timer 5,arret :timer_off 5 gosub procedure end
procedure: timer_off 5 repeat item_add 1,a:a=a+1 :wait 100 if a/10=int(a/10) passage=passage+1 :timer_on 5 end: ' ou return idem end_if until scancode=27 return
arret: timer_off 5 show 10 item_add 11,"passage:"+str$(passage) return
bouton: timer_off 5:hide 10 gosub procedure return J'arrive pas à me concentrer en ce moment, mais c'est un procédé que j'utilise régulièrement. Là j'ai mis passage =passage +1, mais en définissant passage pour tel ou tel chose, je fais des choses diverses, mais là je n'arrive pas à me concentrer. Je suis pris par d'autres idées. |
| | | Nardo26
Nombre de messages : 2294 Age : 55 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Interrompre une tâche Ven 14 Oct 2011 - 16:43 | |
| Bonjour cosmos ! Si ton sous-programme est dans un traitement d'évènement, il est non-interruptible. (je me trompe peut-être, à confirmer avec Jack). Une solution : C'est de faire un traitement par lot... tu découpes ton traitement en plusieurs tranches (en arrière plan, déclenché par timer) par exemple : - Code:
-
TIMER 1: TIMER_OFF 1: TIMER_INTERVAL 1,2000 : 'on déclenche un traitement toutes les 2 secondes start=1 END timer1: timer_off 1 for i=start to start+100 traitement... next i start=start+100 if NOT EOF() timer_on 1 end_if return
A partir de là, tu peux tester une touche, un bouton à tout moment et stopper le timer qui effectue ton traitement... | |
| | | JL35
Nombre de messages : 7095 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Interrompre une tâche Ven 14 Oct 2011 - 16:53 | |
| Merci les amis pour votre promptitude à répondre ! (Nardo, tu redémarres fort). Oui mon sous-programme est bien déclenché par un événement (clic sur un bouton) et il me semblait bien que ce n'était pas possible de l'interrompre.
En fait j'ai un peu changé mon fusil d'épaule: avant j'écrivais le résultat de ma boucle dans un fichier eet je ne pouvais rien faire avant la sortie. Maintenant j'affiche au fur et à mesure mes lignes de résultat (une à chaque bouclage) dans un LIST, avec DISPLAY à chaque ligne (sinon rien ne s'affiche avant la fin), et là miracle, je détecte le clic sur le bouton Stop. Alors du coup, mon problème est résolu (voyez ça dans 'Vos sources...', l'Explorateur maison que je vais mettre à jour tout de suite.
Et merci encore à tous les deux, je vais quand même étudier vos solutions. | |
| | | Invité Invité
| Sujet: Re: Interrompre une tâche Ven 14 Oct 2011 - 17:48 | |
| Je ne retrouve pas tout à fait ma méthode, mais voici pour interrompre une boucle qu'on arrive pas à voir les résultats intermédiaires, tester et continuer. Surement qu'il y a plus simple, mais cela m'échappe pour le moment. - Code:
-
label arret ,procedure , bouton ,boucle ,fin dim a memo 1 button 2:top 2,150:caption 2,"stop":on_click 2,arret form 10:left 10,300 :hide 10 memo 11:parent 11,10 button 12:parent 12,10:left 12, 70:top 12,150:caption 12,"continu":on_click 12,bouton button 13:parent 13,10:left 13,180:top 13,150:caption 13,"quittez":on_click 13,fin timer 5:timer_interval 5,200 : on_timer 5,arret :timer_off 5 on_click 0, procedure message "cliquez sur la forme pour démarrer" end
procedure: repeat:until scancode=0 timer_off 5 repeat gosub boucle :wait 100 until scancode=27 return
boucle: if scancode=1 timer_on 5 end else if active(2)=1 then item_add 1,a : a= a + 1 end_if return
arret: timer_off 5 inactive 2 :show 10 item_add 11,"a:"+str$(a) return
bouton: timer_off 5:active 2 :hide 10 gosub procedure return
fin: terminate |
| | | Contenu sponsorisé
| Sujet: Re: Interrompre une tâche | |
| |
| | | | Interrompre une tâche | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |