[RESOLU] Comment stopper une procédure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

[RESOLU] Comment stopper une procédure

Message 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
Dernière modification par Malo le lun. 20/sept./2010 18:45, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Comment stoper un procédure

Message 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
ImageImage
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stoper un procédure

Message par Backup »

..........................
Dernière modification par Backup le dim. 20/mars/2011 13:55, modifié 1 fois.
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stoper un procédure

Message 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?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stoper un procédure

Message 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 :)
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stopper une procédure

Message par Malo »

Je me disais bien depuis un moment qu'il me fallait une paire de lunettes....
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Comment stopper une procédure

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


@+
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stopper une procédure

Message par Malo »

Je viens de tester sur mon programme avec un thread et cela fonctionne bien
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stopper une procédure

Message par Backup »

ben comme mon exemple en fait ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Comment stopper une procédure

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stopper une procédure

Message 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
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stopper une procédure

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stopper une procédure

Message 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:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Comment stopper une procédure

Message 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.
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Comment stopper une procédure

Message 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.).
Répondre