Page 1 sur 3

[RESOLU] Comment stopper une procédure

Publié : sam. 18/sept./2010 14:33
par Malo
Bonjour

Dans ce petit bout de code, une fois que la procédure "CompteTjrs()" est lancée,
je ne peux pas l'arrêter avec le bouton "Stop".

Merci par avance de m'éclairer sur mon erreur

Code : Tout sélectionner

Procedure CompteTjrs()
	For i=1 To 20
		a +1
		Debug a
		Delay(1000)
	Next

EndProcedure




Procedure Fenetre_Generale()
	If OpenWindow(#Fenetre,0,0,300,400,"Fenetre  :",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		TextGadget(#Text, 20, 180, 100, 20, "Saisir")StringGadget(#S_Nom, 20, 200, 300, 25, "")
		ButtonGadget(#Valider, 20, 250, 80, 50, "Valider");
		ButtonGadget(#Stop, 120, 250, 80, 50, "Stop");
	EndIf
     
EndProcedure

Fenetre_Generale()

Repeat
	evenement = WaitWindowEvent()
	If evenement = #PB_Event_CloseWindow
		Select EventWindow() 
			Case #Fenetre
				quit = 1
		EndSelect  
	EndIf
	     
	     
	     
	; Evènements  Gadget
	If evenement =  #PB_Event_Gadget
		Select EventGadget()
			Case #Valider
				CompteTjrs()
			Case #Stop
				quit = 1
		EndSelect
	EndIf
     
Until quit = 1

Re: Comment stoper un procédure

Publié : sam. 18/sept./2010 14:55
par case
c'est a cause du delay(1000) qui bloque l'exécution du programme pendant 20 secondes ce temps et donc le clic sur le bouton quit est innoperant.*

vu que les tests se situent hors de la procedure

Re: Comment stoper un procédure

Publié : sam. 18/sept./2010 15:07
par Backup
..........................

Re: Comment stoper un procédure

Publié : sam. 18/sept./2010 15:57
par Malo
Bonjour

Merci à vous deux pour vos réponses

@ Case ; j'ai mis Delay(1000) juste pour donner du "volume" à la procédure pour avoir le temps de cliquer sur Stop,
sinon on ne voit rien.

@Dobro ; Désolé pour les constantes je n'avais pas vu que je n'avais pas tout sélectionné pour coller le code.
Ok merci pour la solution avec le thread, donc à part le thread il n'y a pas d'autre solution?

Re: Comment stoper un procédure

Publié : sam. 18/sept./2010 16:59
par Backup
Malo a écrit : Ok merci pour la solution avec le thread, donc à part le thread il n'y a pas d'autre solution?
si !
Dobro a écrit :tu aurai pu utiliser un timer aussi :)

Re: Comment stopper une procédure

Publié : sam. 18/sept./2010 20:39
par Malo
Je me disais bien depuis un moment qu'il me fallait une paire de lunettes....

Re: Comment stopper une procédure

Publié : sam. 18/sept./2010 20:44
par G-Rom
tu ne peut pas "stopper" une procédure , dès lors que tu l'as appeler et quelle tourne dans une boucle
ton programme ne fait rien d'autre.

la seule solution est de lancer cette dite procédure en thread , de cette manière , ton programme lance le thread et exécute
ta boucle ( dans ta procedure ) de manière parallèle à ton programme principal, repeat/until continue donc.


@+

Re: Comment stopper une procédure

Publié : sam. 18/sept./2010 21:25
par Malo
Je viens de tester sur mon programme avec un thread et cela fonctionne bien

Re: Comment stopper une procédure

Publié : sam. 18/sept./2010 22:53
par Backup
ben comme mon exemple en fait ;)

Re: Comment stopper une procédure

Publié : sam. 18/sept./2010 23:18
par G-Rom
Dobro a écrit :ben comme mon exemple en fait ;)
le tiens est dangereux :mrgreen:

une correction :
Select EventGadget ()
Case #Valider
If IsThread(Thread) = #Null
Thread = CreateThread (@ CompteTjrs(), *Valeur) ; creation du thread
EndIf
Case #Stop
If IsThread(Thread)
KillThread (Thread) ; on kill le thread !! (ne pas oublier : o) )
EndIf
quit = 1
EndSelect
ne pas oublier la présence des threads pour ne pas le lancer plusieurs fois & ne pas killé qq chose qui n'existe pas ! :mrgreen:

Re: Comment stopper une procédure

Publié : dim. 19/sept./2010 8:12
par Backup
oui tu as raison :)

je vais souvent a l'essentiel en négligeant les "If is"
parceque je trouve que ça alourdi les exemples...

mais c'est vrais , faut en tenir compte :D

Re: Comment stopper une procédure

Publié : dim. 19/sept./2010 10:31
par Malo
@ Dobro ; oui c'est en prenant ton exemple que j'ai testé mon code.

J'avais anticipé la remarque de G-Rom, car comme j'avais mis des débug pour voir
comment ce comportait mon code avec les threads ( j'en ai un autre qui tourne pour faire un affichage de temps),
et je me suis aperçu que ça plantait.
Donc j'ai verifier l'existance ou non du dernier thread avant d'agir dessus, et maintenant cela fonctionne bien.

Heureusement que la doc est en français ça aide, même si je regrette que parfois qu'il manque d'exemples dans certains cas .

Merci à vous

Re: Comment stopper une procédure

Publié : dim. 19/sept./2010 10:43
par Backup
ce que les "Débutants" ne percutent pas toujours c'est la possibilité
de mettre ton curseur sur une instruction Purebasic et d'appuyer sur la touche F1 !

ça ouvre automatiquement la doc sur la fonction(instruction) concernée

finalement a force d'utiliser ce principe , je ne tape quasi plus de
code au clavier , je passe mon temps a copier coller de la doc , ou bien de
mes multiples exemples, que je collectionne depuis pas mal de temps :)

après avoir connu ce systeme la , c'est très très dur de revenir
au codage "a la main" :lol:

Re: Comment stopper une procédure

Publié : dim. 19/sept./2010 10:58
par nico
KillThread n'est pas toujours une bonne solution, car dans une boucle on ne peut pas se permettre d'arrêter le programme à n'importe quel moment; dans ce cas il est préférable d'utiliser une variable et laisser la boucle se terminer proprement.

Re: Comment stopper une procédure

Publié : dim. 19/sept./2010 12:56
par Fred
Pour ainsi dire, KillThread() n'est jamais une bonne solution, car la memoire allouée par le thread (sa propre pile) n'est pas désallouée. C'est une commande à utiliser uniquement quand il y a un vrai probleme (le thread est bloqué etc.).