Page 1 sur 1
Effacer un buffer
Publié : mer. 16/mai/2007 19:57
par Antoine59
Salut tout le monde, je suis nouveau sur Purebasic et je viens de rencontrer un problème.
Voici une ligne de code :
Des données sont écrites dans le buffer, je les écris dans un gadget de type texte :
Le problème est que ces 2 lignes sont dans une boucle et lorsque de nouvelles données sont entrées dans le buffer et que ces nouvelles données sont plus "petite" que les anciennes données, j'ai par exemple :
Purebasic+Blitz=Blitzasic
J'ai essayé d'effacer le buffer avec un FreeMemory() mais cela n'efface rien, ça libère juste la mémoire. J'ai aussi essayé d'utiliser un PokeS(Buffer,"") mais encore une fois, ça remplace juste les données, ça ne les efface pas.
Publié : mer. 16/mai/2007 20:01
par minirop
tu veux effacer le contenu de ton editorgadget ?
SetGadgetText(0, "") devrait faire l'affaire non ?
Publié : mer. 16/mai/2007 20:05
par tmyke
Pour le buffer, un petit code comme celui-ci ne pourrait--il pas faire l'affaire
Publié : mer. 16/mai/2007 20:12
par tonton
yo, on peut effacé avec des espaces
comme: text$ = Space(20)
met 20 space dans text$.
ou alore ajoute un octect de valeur 0 a chaque fin de nouveau text.
le zero indique la fin de la chaine.
bonzoir
Publié : mer. 16/mai/2007 20:13
par Antoine59
Merci tmyke, c'était ça

Publié : mer. 16/mai/2007 20:15
par Antoine59
Oula tonton, encore un peu et on se rentrait dedans

J'avais essayé en mettant un 0 au début mais il voulait rien savoir.
Publié : mer. 16/mai/2007 20:19
par comtois
Resultat = ReceiveNetworkData()
Normalement Il faut tester la valeur de Resultat , pour boucler tant qu'il y a des données, mais aussi pour faire un PeekS(Buffer, Resultat) ? pas sûr que ça fonctionne comme ça, mais ça éviterait de mettre à zéro le buffer inutilement puisque tu ne lirais que le nombre des données reçues.
Publié : mer. 16/mai/2007 20:24
par Anonyme
Code : Tout sélectionner
RandomSeed(655635)
Global Dim Mot$(10)
Mot$(0)="......??"
Mot$(1)="BOB"
Mot$(2)="ROBERT"
Mot$(3)="PUREBASIC"
Mot$(4)="SARKOZY"
Mot$(5)="SEGOLENE ROYALE"
Mot$(6)="JEAN MARIE LEPEN DIT LE BORGNE"
Mot$(7)="JACQUES CHIRAC"
Mot$(8)="TARTANPION"
Mot$(9)="SUCE MOI LE BOUT"
Mot$(10)="BIPED A SEXE CREUX"
Procedure Emule_ReceiveNetworkData(*Buffer.l,length.l)
Line$ = Mot$(Random(10))
PokeS(*Buffer,Line$,length)
EndProcedure
OpenWindow(0,0,0,256,256,"TEST")
CreateGadgetList(WindowID(0))
TextGadget(0,10,10,256,20,"NULL")
Repeat
event = WindowEvent()
If Timer<ElapsedMilliseconds()
Timer=ElapsedMilliseconds()+500
*MyBuffer = AllocateMemory(1000)
Emule_ReceiveNetworkData(*MyBuffer,1000)
Text$ = PeekS(*MyBuffer)
SetGadgetText(0,Text$)
FreeMemory(*MyBuffer)
EndIf
Until event = #PB_Event_CloseWindow
@Comtois, je ne crois pas que tu sois obligé de testé resultat, il faut juste que la taille du buffer de reception soit beaucoup plus grand que les données recues
Publié : mer. 16/mai/2007 20:26
par Antoine59
Ben voilà ma condition
Code : Tout sélectionner
If NetworkServerEvent()=2
ClientID = EventClient()
ReceiveNetworkData(ClientID, Buffer, 1000)
SendNetworkString(ClientID, Buffer)
SetGadgetText(0, PeekS(Buffer))
BufferLength = MemoryStringLength(Buffer)
For i = 0 To BufferLength
PokeB(Buffer+i, 0)
Next
EndIf
C'est exécuté seulement s'il reçoit un message du client donc normalement il n'y a pas de problème.
Publié : mer. 16/mai/2007 20:32
par Anonyme
Recoucou, je ferais comme ca moua
Code : Tout sélectionner
If NetworkServerEvent()=2
*Buffer = AllocateMemory(1000)
ClientID = EventClient()
ReceiveNetworkData(ClientID, *Buffer, 1000)
SendNetworkString(ClientID, *Buffer) ; ? un peu bizarre :) tu renvois la chose que tu as recu :/
Text$ = PeekS(*Buffer)
SetGadgetText(0,Text$)
FreeMemory(*Buffer)
EndIf
pour tous ce qui est pointeur j'utilise aussi "*" (sans les apostrophes )
@++
Publié : mer. 16/mai/2007 20:46
par Antoine59
Heu oui, le SendNetworkString, c'était juste un truc pour le fun on va dire. J'ai oublié de l'enlever en postant.
Ton code marche très bien aussi, c'est le fait d'allouer à chaque fois la mémoire qui permet d'avoir un buffer toujours vide avant d'écrire dedans. Moi je l'avais alloué avant la boucle évènementielle.
Publié : jeu. 17/mai/2007 15:33
par gnozal
Dans l'API windows, il y a cette fonction pour mettre à zéro un buffer : RtlZeroMemory_(*Buffer, Longueur.l)
Publié : lun. 21/mai/2007 20:46
par Antoine59
gnozal a écrit :Dans l'API windows
Bouh quel vilain mot !
Je préfère utiliser des commandes portables. Merci quand même.