Variables déclarées avec Dim.

kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 - 28 août 2009 à 16:42
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 30 août 2009 à 20:41
Bonjours, Voilà une question me trotte l'esprit depuis pas mal de temps à propos des variables utilisées dans des fonctions indexées. Je m’explique.

J’ai un petit serveur qui utilise des winsock indexé pour recevoir les clients. Ainsi je reçois les envois des clients sous cette fonction :

Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
End Sub

Se qui me trotte c’est que si je déclare des variables dans la fonction avec “Dim” est se que si 2 clients envoie une information en même temps la variable peux faire un conflit ? ( Exemple elle pourrai en plein milieu de la fonction changer et prendre l’autre Data, se qui serrait embêtant )

… ou devrais-je déclarer ma variable également indexée pour éviter les conflits. Difficile d’expliquer…

------------------------------------------------
Dim Tmp as string
Winsock2(Index).GetData Tmp

Devrais-je plutôt pas transformer en :

Dim Tmp(MaxClient) as string
Winsock2(Index).GetData Tmp(index)
------------------------------------------------

Je sais pas trop comment sa se passe…

Et également si 2 Winsocks reçoivent en même temps un envois est-ce que la fonction DataArrival va se faire 2 fois en même temps ( comme si il y avait 1 fonction par Winsock ) ou si VB va d’abord exécuter l’une puis une deuxième fois avec le second ?

Merci.
kakenette

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 août 2009 à 18:28
Salut
Si tu ne mets pas de DoEvents dans le code du DataArrivals, aucune chance de mélanger les données (et encore). Le DoEvents "pourrait" avoir pour effet d'autoriser le redémarrage de la Sub pour un autre Index. J'ai jamais testé, mais je n'ai jamais eu de problème avec ça.
Un programme ne peut pas déclencher deux évènements en même temps, il y en a forcemment un avant l'autre.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
28 août 2009 à 18:40
Donc si je met "Dim TMP as string" je peux tout faire avec ça sans avoir de problème. Mais il se passerait quoi dans le qua ou le serveur recevrait 2 ou 3 envois qui arriveraient pile en même temps ? ...Je vais donc regarde si j'ai mis de DoEvents si c'est le qua, je vais tousses les enlevés. Et puis si je fait appelle à des sous fonctions qui font sortir de la Sub dans le DataArival ça pose pas de problème temps que il n'y a pas de DoEvents?

kakenette
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 août 2009 à 11:12
Re
Un conseil : Ne traite pas tes messages reçus dans DataArrivals, mais transfère simplement le contenu du buffer du Socket dans une variable chaine tableau (déclarée dans la partie déclaration de ta forme) dont l'index correspondra à l'Index de ton Winsock, exemple :
Private mesDonnées(1 To 10) As String
Sub monSocket_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  mesDonnées(Index) = mesDonnées(Index) & monSocket(Index).GetData, , bytesTotal
End Sub
Puis, dans un Timer (pas forcment très rapide), traite toutes les chaines contenues dans ton tableau.
Deux avantages :
- Si le traitement que tu dois faire avec les données reçues est long, mieux vaut ne pas pénaliser le débit de transfert en bloquant (*) la Sub DataArrival jusqu'au vidage du buffer
(*) le temps d'exécution du long code
- Un long message peut arriver en plusieurs morceaux / plusieurs déclenchements de DataArrival. Le fait de stocker ce qui arrive permet de stocker les morceaux et de tester plus tard (dans le Timer) si la chaine reçue est complète.

J'espère avoir été clair, désolé, je n'ai pas beaucoup de temps.
Je pourrais t'en reparler demain soir, si besoin.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
30 août 2009 à 19:23
Intéressant mais après où placer ma "Select Case" ( Qui est actuellement dans DataArrival )?

Super merci de te réponse je suis très intéressée d'en connaître plus sur ton raisonnement.

kakenette
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 août 2009 à 20:41
Re
Une fois que tu as stocké tes données dans ton tableau, il te suffit de dépouiller les contenus dans une Timer, paisiblement.
Rappel : Les données peuvent arriver en plusieurs fois = plusieurs déclenchements de DataArrivals
Il est donc important, avant de traiter une chaine, de vérifier que ton message est arrivé en entier.
Pour ce faire, il faut que, côté émetteur, tu ajoutes un caractère représentant ctte fin de message, par exemple un Chr$(0), c'est à dire un caractère que tu ne risques pas de retrouver dans tes données. Lors du traitement, il te suffira donc de vérifier qu'il y a bien un Chr$(0) dans ta chaine (simple Instr) pour être sûre d'avoir qqchose à traiter.
Bien sûr, l'inverse est aussi vrai : Quand tu reçois des données et que tu ne les traites qu'après coup, il est possible que la variable dans ton tableau contienne deux (ou +) messages : Il faut donc que, après le traitement du premier message, tu supprimes la partie traitée, mais pas toute la variable, et que tu recommences la vérification de présence du caractère de fin de message, etc.

Si tu charges un ou deux exemples de Chat utilisant les Winsocks, tu retrouveras cette technique.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous