Effacer un buffer

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

Effacer un buffer

Message par Antoine59 »

Salut tout le monde, je suis nouveau sur Purebasic et je viens de rencontrer un problème.

Voici une ligne de code :

Code : Tout sélectionner

ReceiveNetworkData(ClientID, Buffer, 1000)
Des données sont écrites dans le buffer, je les écris dans un gadget de type texte :

Code : Tout sélectionner

SetGadgetText(0, PeekS(Buffer))
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.
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

tu veux effacer le contenu de ton editorgadget ?
SetGadgetText(0, "") devrait faire l'affaire non ?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Pour le buffer, un petit code comme celui-ci ne pourrait--il pas faire l'affaire

Code : Tout sélectionner

for i = 0 to tailleBuffer
	pokeB(buffer+i, 0)
next
Force et sagesse...
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

Message par Antoine59 »

Merci tmyke, c'était ça ;)
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Anonyme

Message 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
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

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

Message 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 ) :D

@++
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

Message 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.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Dans l'API windows, il y a cette fonction pour mettre à zéro un buffer : RtlZeroMemory_(*Buffer, Longueur.l)
Antoine59
Messages : 11
Inscription : mer. 16/mai/2007 19:51

Message par Antoine59 »

gnozal a écrit :Dans l'API windows
Bouh quel vilain mot ! :lol:
Je préfère utiliser des commandes portables. Merci quand même.
Répondre