IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.NET]Comment calculer vitesse de transfert de fichier?


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [VB.NET]Comment calculer vitesse de transfert de fichier?
    Bonjour,

    Je voudrais créer une procédure permettant de calculer la vitesse de transfert d'un fichier ( avec les sockets ) que j'envois par packet de 4096 et mettre un timer disant le temps estimé du transfert...

    Comment faire : :

    Merci beaucoup

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Le principe habituel, c'est de calculer la vitesse moyenne de ce qu'on a déjà reçu et d'en déduire le temps total de transfert à cette vitesse.
    Pas besoin d'un timer, le temps se mesure avec DateTime.Now.Ticks.

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Le principe habituel, c'est de calculer la vitesse moyenne de ce qu'on a déjà reçu
    et comment on fait ca ?

  4. #4
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par Aspic
    Le principe habituel, c'est de calculer la vitesse moyenne de ce qu'on a déjà reçu
    et comment on fait ca ?
    C'est pas compliqué, il te faut un compteur du nombre de bytes envoyés.
    Avant de lancer le traitement, tu créé une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim startTime As Long = DateTime.Now.Ticks
    et ensuite, à chaque envoi de 4096, la vitesse en octets/seconde est donnée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim speed As Long = bytesEnvoyesDepuisLeDebut / (DateTime.Now.Ticks - startTime)
    speed *= 10000000
    En tout cas ça doit ressembler à ça

    Si tu veux plus d'infos, colle moi ton code d'envoi...

  5. #5
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Ca à pas l'air de marcher...

    Tien voici ma procedure d'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
                Dim rest As Integer = 4096
                Dim cptWhile As Integer = 0
                Dim Buffer(rest) As Byte
                Dim startTime As Long = DateTime.Now.Ticks
     
                StreamRead = New FileStream(TextFolder.Text, FileMode.Open, FileAccess.Read)
                Dim data(StreamRead.Length) As Byte
     
                While Not cptWhile = StreamRead.Length \ rest
                    cptWhile += 1
                    StreamRead.BeginRead(Buffer, 0, rest, AddressOf read, StreamRead)
                    PBenvoi.Value = 100 * (cptWhile * rest / data.Length)
                    SocketFichierSvr.EnvoyerFichier(Buffer, rest)
                    Dim speed As Long = cptWhile * rest / (DateTime.Now.Ticks - startTime)
                    speed *= 10000000
                    Label3.Text = speed
                End While
     
                'envoi le reste des données
                rest = data.Length - (cptWhile * 4096) - 1
                Buffer = New Byte(rest) {}
                StreamRead.BeginRead(Buffer, 0, rest, AddressOf read, StreamRead)
                If rest > 0 Then SocketFichierSvr.EnvoyerFichier(Buffer, rest)
    merci

  6. #6
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par Aspic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim rest As Integer = 4096
    Dim cptWhile As Integer = 0
    Si tu déclares ces deux variables en Long :
    Bon par contre ma connaissance du VB est assez limitée, et je vois pas trop dans ton code
    Sinon voici un petit code basique qui illustre quelque chose de proche de ce que tu veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim startTime As Long = DateTime.Now.Ticks
    Dim sizeToSend As Integer = 4096
    Dim sent As Long = 0
    Dim chance As Random = New Random
    While True
    	sent += sizeToSend
       System.Threading.Thread.Sleep(chance.Next(100, 1000))
    	Dim speed As Long = (sent * 10000000) / (DateTime.Now.Ticks - startTime)
    	Console.WriteLine(speed)
    End While
    PS : Ma première idée est justifiée par le fait que si tu mets "Dim sent As Integer" ici, ça ne marchera pas...

    Dernière précision,
    Ca à pas l'air de marcher...
    Cela signifie ? Exception ? Résultat inattendu ? (si oui lequel) ...

  7. #7
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Sinon y'a pas d'erreur juste le resultat innatendu c'est à dire que c'est toujours 0 que vaut Speed...

    j'ai regarder donc la c'est bizarre car la vitesse augmente constament... forcement car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim speed As Long = (cptWhile * rest * 10000000) / (DateTime.Now.Ticks - startTime)
    comme cptWhile * rest augmente constament le resultat de la division augmente... je comprends pas ! De plus pourquoi tu multiplies par 10000000 ??

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    speed est un Long et le calcul donne un nombre très inférieur à 1 -> Le résultat est arrondi à 0 .
    speed doit ête un Double.

  9. #9
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par NicolasG
    speed est un Long et le calcul donne un nombre très inférieur à 1 -> Le résultat est arrondi à 0 .
    speed doit ête un Double.
    Moi ça m'a fait ça (dans l'exemple que j'ai montré) si l'un des nombres utilisés était un Integer... Je vois pas pourquoi un Long marcherait pas M'enfin c'est vrai que ce qu'il lui affiche ressemble beaucoup à ce que tu dis donc c'est à essayer.
    Par contre là où j'avais fait une bêtise c'est séparer la multiplication par 10000000 et c'est à mon avis de là que vient l'erreur... Donc essayes de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim speed As Long = cptWhile * rest * 10000000 / (DateTime.Now.Ticks - startTime)
    Ca m'étonnerait que ça ne marche pas mieux !

    [Edit pour réagir à l'Edit ] :
    comme cptWhile * rest augmente constament le resultat de la division augmente... je comprends pas ! De plus pourquoi tu multiplies par 10000000 ??
    Non le résultat de la division n'est pas supposé augmenter (ou pas spécialement en tout cas), je divise par (DateTime.Now.Ticks - startTime) donc au cours du temps, ce nombre augmente !
    PS : Je multiplie par 10000000 car le résultat de DateTime.Ticks est en dixième de micro-secondes. Or on ne veut pas un résultat en octet/dixième de micro-seconde

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    en le mettant en integer ca a l'air de marcher ( le double marchais aussi mais j'avais 6 chiffres apres la virgule et puis je voulais un nombre rond ou alors avec un chiffre apres la virgule mais je sias pas comment faire ca.. )
    Y'a t-il une possibilité de mettre ca dans un timer car dans ma boucle ca la fait ralentir considérablement et donc le transfert est plus lent !!
    De plus comment estimer le temps restant du transfert ? ( ce qui me permetrra de verifié si la vitesse est la bonne )

    Merci

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Une petite révision des proportions ?

    On a choisi de calculer la vitesse moyenne V = [taille envoyée (octets)] / [temps écoulé (secondes)]
    Le temps de transfert total en secondes est T = [taille fichier en octets]/V
    Le temps restant en secondes est donc T-[temps écoulé(secondes)]

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    lool merci bcp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2006, 10h49
  2. [VB.Net] Comment lire une url depuis un fichier .ini ?
    Par lewebdalex dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/05/2006, 20h32
  3. Réponses: 7
    Dernier message: 21/03/2006, 13h01
  4. Réponses: 1
    Dernier message: 09/03/2006, 17h55
  5. Réponses: 4
    Dernier message: 27/07/2005, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo