Liste tampon fifo utile pour winsock par exemple

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 770 fois - Téléchargée 32 fois

Contenu du snippet

Voici un petit code pour faire une liste de type FIFO tres utile pour par exemple une appli WINSOCK multi client.
si votre winsock serveur est tres sollicite par plusieurs clients, et que le temp des traitements serveur risque par moment de depasser les intervalles de demande des clients alors une liste FIFO est neccessaire pour faire un tampon et laisser le temps au serveur de gérer l'execution de son code mais aussi de ne perdre aucunes informations ou faire des melanges.

J'utilise un timer de 1ms mais ce n'est pas lui qui cadence les traitements de la liste ( sinon ca ralentirai sensiblement sur des gros traitements ),
ce timer sert juste a avoir une inactivite lorsqu'il n'y a rien a traiter, par contre dès que la liste se rempli on la traite jusqu'a ce qu'il n'y est plus rien

Source / Exemple :


'cree un formulaire et placé y un timer de 1 ms et un bouton Command1

Dim ListFifo() As String

Function RempliFIFO(MyDonnee As String)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Ajout d'une donnee a notre liste FIFO, des qu'elle est ajoutée, on décale toute notre
'liste de 1 pour que ListFifo(0) soit disponible pour recevoir une nouvelle donnee
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ListFifo(0) = MyDonnee 'met la donnee en premiere position de la pile
    ReDim Preserve ListFifo(UBound(ListFifo()) + 1) 'ajoute un element a la pile
    For i = UBound(ListFifo()) - 1 To 0 Step -1 'boucle pour decaler les donnees de la pile
        ListFifo(i + 1) = ListFifo(i) 'decalage de + 1 pour rendre dispo la premiere postion de la pile
    Next
    DoEvents
    
End Function

Private Sub Command1_Click()
RempliFIFO "test liste FIFO" 'appel la fonction pour alimenter la liste FIFO
End Sub

Private Sub Form_Load()
ReDim Preserve ListFifo(0) 'initialise le premier enregistrement de la pile
End Sub

Private Sub Timer1_Timer()
MyDonneeATraiter As sitrng
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Timer de traitement des informations contenu dans la pile
'si il y a au moins une donnee recu on traite toute la liste FIFO cela permet d'optimiser
'le traitement et de ne pas dependre du timer de 1 ms
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If UBound(ListFifo()) > 0 Then  'si il y a une donnee a traiter 
    For i = UBound(ListFifo()) To 1 Step -1 'parcours la liste dans l'ordre inverse (on traite de la premiere info recu a la derniere)
        ''''''''''''''''' c'est en dessous que l'on execute ce que l'on veut avec cette donnee
        MyDonneeATraiter = ListFifo(UBound(ListFifo()))  'lit le derniere position de la pile
        'ici code pour traiter la donnee ou renvoi vers une fonction
        '''''''''''''''''
        If UBound(ListFifo()) > 0 Then ReDim Preserve ListFifo(UBound(ListFifo()) - 1) 'si la pile a + d'1 enregistrement supprime le dernier enregistrement puisque deja traité
        DoEvents 'pour ne pas prendre toutes les ressources CPU dans des traitements continus de la liste Fifo
    Next
End If
End Sub

A voir également

Ajouter un commentaire Commentaires
thierrydelepine
Messages postés
521
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
11 septembre 2008
6
29 mars 2004 à 15:37
Je rajoute :

j'ai mis ce code car lorsque je cherchais une solution similaire et lors de mes recherches sur VBFrance, j'avais vu des exemples fait par d'autres developpeur mais avec des composants ADO ???? un peu lourd quand même ??
là c'est juste une liste....
thierrydelepine
Messages postés
521
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
11 septembre 2008
6
29 mars 2004 à 15:34
Je sais que cette solution n'est pas la seule, il y a sans doute plein de façon d'y arriver, d'ailleurs si quelqu'un a mieux qu'il pose un exemple de code.

pour kyrosgear :
Le but de cette Liste FIFO n'est pas de cumuler des milliers de données (je pense que la le principe serait à revoir ), comme tu le dis faire des décalements de données prendraient des ressources.

par contre dans un cas précis c'est intéressant, c'est si, PAR MOMENT, des demandes clients arrivent en même temps (ou presque) et que le serveur n'a pas fini son traitement précédent, dans ce cas on cumule les quelques demandent en attente, pour les traiter au fur et a mesure. (dans mon cas a moi les clients attendent la reponse du serveur ou time out avant de relancer une autre demande donc mon Pb a moi c'etait l'arrivée de demandes de clients quasi en meme temps ).

Fixer le buffer m'embête, alors que la la taille de la liste croit au fur et a mesure qu'elle se rempli, moi je ne m'occupe que de traiter la derniere donnée de ma liste l'avantage de cette technique c'est que on peut continuer a remplir la liste alors qu'en meme temps on la traite (on ne connait pas la position que l'on traite on sait juste que c'est la derniere).

en tout cas si tu pense que ta solution peut être valable pose un bout de code que je test.

n'hésitez pas à critiquer et surtout ( si vous critiquez ) proposé des choses concraites et avec un exemple pour faire avancer le Chimlblic.
kyrosgear
Messages postés
4
Date d'inscription
mercredi 19 juin 2002
Statut
Membre
Dernière intervention
23 avril 2004

29 mars 2004 à 15:10
je me demande s'il ne serait pas plus interessant d'ajouter un indice de lecture, un tableau d'entiers indiquant l'ordre d'accès, un indicateur de "buffer restant" et un tableau de bits (je pense à un tableau de bytes en utilisant un xor et un modulo) pour trouver les "cases vides". et on modifie uniquement la taille si nécessaire (peutetre meme par "paquet" pour encore réduire le nombre de modifications?)
Je pense que ce serait moins lourd en traitement que de déplacer à chaque ajout toutes les données du buffer. :o)

mais de toute façon on risque encore d'arriver à tableau utilisant énormément de mémoire meme lorsque cela n'est pas nécessaire
et pour ça il faudrait mettre en oeuvre un système de tassement, qui peut prendre pas mal de temps d'execution, d'où je ne sais pas s'il est vraiment interessant...

il est peutetre aussi interessant de fixer un buffer initial en rapport avec l'utilisation, pour minimiser dès le début les changements de taille des 3 tableaux.

:o) ce sont juste des suggestions, je ne suis qu'étudiant :op

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.