Page 1 sur 1

[OK] Thread et debug

Publié : mer. 02/juin/2010 21:13
par Ar-S
Ce code fonctionne

Code : Tout sélectionner

Procedure.s Toctoc()
  MessageRequester("Thread","Toctoc")
EndProcedure

MessageRequester("1","Le thread va se lancer et le requester 2 va s'ouvrir en même temps")
toc=CreateThread(@Toctoc(), 0) 
MessageRequester("2","Qui est là ?")
KillThread(toc)
End
mais si je lance le debugger, j'ai un message d'erreur :
"The procedure specified in '@ProcedureName()' does not have the required argument or returntype."

C'est grave docteur ?

Re: Thread et debug

Publié : mer. 02/juin/2010 21:28
par Backup
faut pas typer tes procedure dans un thread !

Code : Tout sélectionner

Procedure Toctoc(*bidon)
  MessageRequester("Thread","Toctoc",#PB_MessageRequester_Ok)
EndProcedure

MessageRequester("1","Le thread va se lancer et le requester 2 va s'ouvrir en même temps")
toc=CreateThread(@Toctoc(), 0)
MessageRequester("2","Qui est là ?")
KillThread(toc)
End
mais ce code ne marche pas non plus parceque il ne peut y avoir qu'un requester en meme temps ! (apparemment)

Re: Thread et debug

Publié : mer. 02/juin/2010 21:55
par G-Rom

Code : Tout sélectionner

Procedure.s Toctoc(*bidon)
  MessageRequester("Thread","Toctoc",#PB_MessageRequester_Ok)
EndProcedure
Elle renvoie rien ta procédure.
de plus renvoyer un string dans un thread n'est pas possible il me semble.
tu peut renvoyer un pointeur , ou modifier une chaine via un pointeur sans retour de valeur comme ceci par exemple :

Code : Tout sélectionner

Procedure.i MyThread(*Pointer.i)
  Chaine.s = PeekS(*Pointer)
  Chaine   = ReplaceString(Chaine,"O","U")
  PokeS(*Pointer,Chaine,Len(Chaine))
EndProcedure



Text$     = "COOL!"
ThreadID  = CreateThread(@MyThread(),@Text$)

While IsThread(ThreadID)


Wend 


Debug Text$

Re: Thread et debug

Publié : jeu. 03/juin/2010 0:32
par Ar-S
Merci,
faut pas typer tes procedures
Qu'entends tu par typer ? (le .s ?)

Ce qui est bizarre est que le code que j'ai posté fonctionne bien sans le debugger..

C'était pour l'exemple, j'utilise pas un thread pour du requester :mrgreen: mais pour ne pas freezer ma fenêtre principale lorsque mon prog calcule des MD5 de plusieurs fichiers. En gros j'appelle ma procédure en Thread et ça marche mais j'ai la même erreur si je lance le debug.

Re: Thread et debug

Publié : jeu. 03/juin/2010 7:09
par Backup
Ar-S a écrit :Merci,
faut pas typer tes procedures
Qu'entends tu par typer ? (le .s ?)
oui :)
Ce qui est bizarre est que le code que j'ai posté fonctionne bien sans le debugger..
ben c'est que ça ne fonctionne pas :)
sans debugger tu suprime par le fait les messages d'erreurs , mais elles sont quand meme là
les erreurs , et finiront par planter ton systeme a un moment ou un autre ... :)

Re: Thread et debug

Publié : jeu. 03/juin/2010 11:43
par Ar-S
Y'a pas à dire j'ai un problème de compréhension pour les threads :|
Malgré les exemples du fofo, malgré la doc (vraiment trop pauvre de ce coté), je n'ai pas la moindre idée de comment syntaxer la procédure (ou le thread).

En gros lors du glissé déposé j'ai

Code : Tout sélectionner

Select EventWindow()
      Case 0
        If event=#PB_Event_WindowDrop
           StickyWindow(0,0) ; on évite le 1er plan pour les messagerequester à venir
          
          ;- Création de la liste
          ClearList(fichier())
          ClearList(MD5())
          NomFichier$=EventDropFiles()
          NbrFichier = CountString(NomFichier$, Chr(10)) + 1
          If NbrFichier>0
            ;Si il y a des fichiers on lance la procedure en Thread pour ne pas freezer la fenêtre
            MD5LIST=CreateThread(@CreateList(), 0) ; JE LANCE MA PROCEDURE ICI
            
          Else
           ;(...blabla....)
          EndIf
        EndIf
        
    EndSelect
Et voilà la procédure (j'ai juste enlever l'écriture du fichier list car là n'est pas le soucis)

Code : Tout sélectionner

Procedure CreateList() ; Procedure lancé au drag n drop
  For i = 1 To NbrFichier
    MonFichier$ = StringField(NomFichier$, i, Chr(10))
    Resultat = FileSize(MonFichier$)
    NomCourt$=GetFilePart(MonFichier$)
    InfoRep$=GetPathPart(MonFichier$)
    
    If Resultat<>-2 ; Si ce n'est pas un répertoire...------------
      setgadgettext(1,nomcourt$)
      MD5$ = MD5FileFingerprint(MonFichier$)
      AddElement(fichier())
      fichier()=NomCourt$
      AddElement(MD5())
      MD5()=MD5$
      repAfichier$=GetPathPart(MonFichier$)
    Else
      ;(----blabla----)
    EndIf
  Next i  
  NbrAtraiter=ListIndex(fichier())+1
  ;Si il y a au moins 1 fichier à traiter, on sauve
  If NbrAtraiter>0
    SetGadgetText(1,Str(NbrAtraiter)+" files have been checked.")

    ;sauvegarde-------------------------------------------
    TitreSauve$="Saving Md5 List"
    sauvegarde:
    StickyWindow(0,0)
    Sauve$=SaveFileRequester(TitreSauve$,repAfichier$+"md5list",filtre$,0)
    If Sauve$
      ;On remet les listes à 0 et on reinitialise TailleFichier---
      ResetList(fichier())
      ResetList(MD5())
      TailleFichier=0
      
      ;Création du fichier liste----------------------------------
     ;(..code d'écriture fichier liste...)
    Else  
    EndIf
    StickyWindow(0,1)
    KillThread(MD5LIST)
    
  EndIf
EndProcedure

Re: Thread et debug

Publié : jeu. 03/juin/2010 17:28
par Geo Trouvpatou
Salut.

Comme te l'a dit Dobro, ce n'est pas Procedure CreateList() que tu dois écrire, mais Procedure CreateList(*parametre_bidon_qui_sert_pas_forcement)

Et comme Procedure CreateList(*parametre_bidon_qui_sert_pas_forcement) est ton Thread, ce n'est donc pas dedans qu'il faut mettre le KillThread.

regardes bien l'exemple de la doc.

[EDIT] Regardes les deux exemples que j'avais mis ici.

Re: Thread et debug

Publié : jeu. 03/juin/2010 17:46
par Ar-S
Ahhhh mais tout simplement ! putain des fois je cherche de midi à 14h pour rien.
C'est fou ce paramètre *bidon quand même ! en effet le debug ne couine plus et j'ai viré mon killthread de la proce.