[RESOLU] Comment stopper une procédure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stopper une procédure

Message par Backup »

Fred a écrit :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.).

Alors là, faut donner une solution par contre !!

dans l'exemple que j'ai mis en couleur
on lance le trhead avec un bouton
et pour le quitter on use d'un autre bouton

sans KillThread() tu fait comment ?

pour moi (dans mon esprit) la creation d'un thread
amenait forcement la destruction de celui-ci
sinon bonjour la multiplication des threads
si plusieurs appels sont effectués ...

faudrai obligatoirement utiliser les mutex ?

d'autre par , pourquoi KillThread() ne libere pas tout ?
ne serai-ce faisable ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Comment stopper une procédure

Message par nico »

Dans mon code alternate data stream où j'utilise une procédure récursive, j'ai placé une variable globale qui lorqu'elle passe à un met fin à la procédure mais qui permet à la procédure de se terminer normalement.
Voir le code.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment stopper une procédure

Message par Backup »

je comprends bien le principe de faire se terminer la procedure
(meme par un Procedurereturn)

mais si on ne kill pas le thread , que deviens t'il ??

a la prochaine relance, il s'accumule dans la ram. avec un autre iD.!?

ou alors le simple fait de quitter la procedure , termine le thread ?
(que l'on pourrai alors recreer a nouveau.. )
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment stopper une procédure

Message par Ar-S »

je serai aussi curieux d'avoir la réponse.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment stopper une procédure

Message par MLD »

Ar-S a écrit :je serai aussi curieux d'avoir la réponse.
Ben moi aussi
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Comment stopper une procédure

Message par Fred »

Un thread se termine correctement des qu'il sort de la procedure qui est passée à CreateThread(). Donc l'idée pour terminer convenablement un thread est de lui faire quitter sa procedure mere, soit via un ProcedureReturn, soit en quittant la boucle via une variable global ou un evemenet etc.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment stopper une procédure

Message par MLD »

Merci Fred
Je note
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment stopper une procédure

Message par Ar-S »

Pour être sûr, est-ce que celà est ok ?

Code : Tout sélectionner

global toto
toto=1

procedure Thread_et_sort(*bidule)
  repeat
    MessageRequester("test","numéro "+str(toto))
    toto+1
  until toto=3
  ProcedureReturn toto
EndProcedure

CreateThread(Thread_et_sort(*bidule),100)

end
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Comment stopper une procédure

Message par Fred »

oui c'est ca. Le "ProcedureReturn toto" ne sert à rien car on ne peut pas recuprer la valeur de sortie d'une procedure threadée.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment stopper une procédure

Message par Ar-S »

ok, ça se décante dans mon citron. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Comment stopper une procédure

Message par Jacobus »

En utilisation dans un programme fenêtré on aurait donc ce genre de chose :

Code : Tout sélectionner

Enumeration 
  #Win
  #Text_time
  #btn_go
  #btn_stop
EndEnumeration 

Global var$ = ""

Procedure Thread_count(*param)
  For a = 1 To 15000
    SetGadgetText(#Text_time," Time = "+Str(a))
    If var$ = "stop"
      Break
    EndIf     
  Next   
  SetGadgetText(#Text_time," Time = "+Str(a)+Chr(13)+"Thread stoppé!") 
EndProcedure 

If OpenWindow(#Win, 0, 0, 300, 100, "Thread", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) <> 0  
  ButtonGadget(#btn_go,10,20,80,25,"Démarrer"):GadgetToolTip(#btn_go,"Lancer le Thread")  
  ButtonGadget(#btn_stop,10,50,80,25,"Stopper"):GadgetToolTip(#btn_stop,"Forcer l'arrêt du Thread")  
  TextGadget(#Text_time,100,20,190,60,"",#PB_Text_Border|#PB_Text_Center)
  SetGadgetColor(#Text_time,#PB_Gadget_BackColor,RGB(23, 33, 41))
  SetGadgetColor(#Text_time,#PB_Gadget_FrontColor,RGB(189, 193, 200))  
  If LoadFont(3,"Courier new",9,#PB_Font_HighQuality|#PB_Font_Bold)
    SetGadgetFont(#Text_time,FontID(3))
  EndIf  
EndIf 

Repeat 
  Event = WaitWindowEvent()
       
   If Event = #PB_Event_Gadget     
     Select EventGadget()   
         
       Case #btn_go : var$ = "go" : CreateThread(@Thread_count(),0)
         
       Case #btn_stop : var$ = "stop"
         
    EndSelect    
   EndIf            
 Until Event = #PB_Event_CloseWindow 
End 


En effet c'est pratique, mais qu'en serait-il d'une fonction telle que CopyDirectory() dans la procédure?
Comment savoir qu'elle est en cours ou terminée pour faire le break en cas d'appui sur "Stop" par exemple?

Prenons cet exemple de procedure pour le thread :

Code : Tout sélectionner

Procedure ThreadCopier(*param)    
  Dossier1$ = "Mondossier 1"  
  Dossier2$ = "Mondossier 2" 
  CopyDirectory(Dossier1$, Dossier2$+"\", "*.*", #PB_FileSystem_Recursive|#PB_FileSystem_Force)  
EndProcedure
Comment arrêter le thread si le dossier à copier fait plusieurs Go et qu'on veut pas attendre ??
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stopper une procédure

Message par Malo »

Merci Fred de te pencher également sur ce problème

Quand j'ai mis le code avec une boucle dans la procédure " CompteTjrs() " c'était pour donner du temps pour montrer mon problème; " comment quitter à tout moment la procédure lancer avec le boutonValider ", s'il n'y avait pas cette boucle on aurait rien vu. Je pensais que la solution aurait été simple.

Dans cette procédure en réalité, je lis un fichier texte, qui peut être de différentes tailles, avec des valeurs , que je manipule,
pour en sortir une présentation sous excel via ComatePlus.
Tout fonctionne très bien , sauf que si la personne à choisit un mauvais fichier ,il lui faut la possibilité de stopper l'opération.

Le problème dans ce cas, si je comprend bien , puisse que le code de ma procédure n'est pas dans une boucle principale l'emploie du Break n'est pas approprié , je devrais mettre une variable avec une condition à différent endroit dans le code, pour pouvoir stoper le Thread .

C'est vrai que le coup du KillThread fonctionnait bien a priori.....mais bon....
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Comment stopper une procédure

Message par case »

on peux faire comme ca par exemple

Code : Tout sélectionner

Declare Thread_count(*file.string)
main=OpenWindow(#PB_Any,0,0,150,100,"test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ouvrir=ButtonGadget(#PB_Any,0,0,150,20,"ouvrir un fichier")
Global alert=0
Repeat
  ev=WaitWindowEvent()
  Select ev
    Case #PB_Event_Gadget
      Select EventGadget()
        Case ouvrir         
          file.string\s=OpenFileRequester("","","",1)
          alert=0
          stop=ButtonGadget(#PB_Any,0,20,150,20,"STOP !")
          CreateThread(@Thread_count(),file)
          DisableGadget(ouvrir,01)
        Case stop
          alert=1
          FreeGadget(stop)
          DisableGadget(ouvrir,0)
      EndSelect
  EndSelect
  
Until ev=#PB_Event_CloseWindow

Procedure Thread_count(*file.string)
  rd=ReadFile(#PB_Any,*file\s)
  If rd  
    Repeat
      Debug "read "+*file\s
    Until Eof(rd) Or alert=1 ; on atteindra jamais la fin du fichier car on ne le lis pas vraiment
    closefile(rd)
  EndIf
EndProcedure 
ImageImage
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: Comment stopper une procédure

Message par Malo »

Oui Case, cela peut être une solution , mais mon problème si je mets beaucoup de code dans la boucle
Repeat, le programme va executer le code, ce qui parrait normal, avant de voir le Until.

En mettant une variable avec une condition , à plusieurs endroit clé dans le code, je sors de la procédure
sans problème, même si ce n'est pas très élégant, mais au moins je ne tue plus le thread, comme le recommande Fred.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] Comment stopper une procédure

Message par Ar-S »

Je relance ce petit topic sur les thread et les arrets de procédure.
Pourquoi mes "MessageRequester()" n'apparaissent-il pas ?

Code : Tout sélectionner

Global toto.l
toto=1

;Declare WorkingProgress(*bidule)

Procedure.l WorkingProgress(*bidule)
  Repeat
    Debug "toto"
    MessageRequester("test","numéro "+Str(toto))
    toto+1
  Until toto=3
EndProcedure

If IsThread(thread)
  Debug "thread ON"
Else
  Debug "thread OFF"
EndIf

thread=CreateThread(@WorkingProgress(),100)

If IsThread(thread)
  Debug "thread ON"
Else
  Debug "thread OFF"
EndIf

Debug "terminé"
End
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre