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
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
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.
et comment on fait ca ?Le principe habituel, c'est de calculer la vitesse moyenne de ce qu'on a déjà reçu
C'est pas compliqué, il te faut un compteur du nombre de bytes envoyés.Envoyé par Aspic
Avant de lancer le traitement, tu créé une variable
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 Dim startTime As Long = DateTime.Now.Ticks
En tout cas ça doit ressembler à ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim speed As Long = bytesEnvoyesDepuisLeDebut / (DateTime.Now.Ticks - startTime) speed *= 10000000
Si tu veux plus d'infos, colle moi ton code d'envoi...
Ca à pas l'air de marcher...
Tien voici ma procedure d'envoi :
merci
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)
Si tu déclares ces deux variables en LongEnvoyé par Aspic
:
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 :
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...
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
Dernière précision,
Cela signifie ? Exception ? Résultat inattendu ? (si oui lequel) ...Ca à pas l'air de marcher...
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
comme cptWhile * rest augmente constament le resultat de la division augmente... je comprends pas ! De plus pourquoi tu multiplies par 10000000 ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim speed As Long = (cptWhile * rest * 10000000) / (DateTime.Now.Ticks - startTime)
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 pasEnvoyé par NicolasG
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
Ca m'étonnerait que ça ne marche pas mieux !
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim speed As Long = cptWhile * rest * 10000000 / (DateTime.Now.Ticks - startTime)
[Edit pour réagir à l'Edit] :
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 !comme cptWhile * rest augmente constament le resultat de la division augmente... je comprends pas ! De plus pourquoi tu multiplies par 10000000 ??
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![]()
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
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)]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager