churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008
-
10 août 2007 à 19:47
churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008
-
21 août 2007 à 10:39
Encore une question... une grosse!
Je suis en train de perfectionner une appli client-serveur dans laquelle je souhaite afficher la progression des transfert de fichiers. Je suis complètement débutant dans le domaine de la prog, ce premier développement m'a déjà beaucoup appris, en cherchant par moi-même et en imaginant des procédés divers et variés, mais là j'aimerais bien un p'tit coup de main (j'ai mal à la tête). Donc, y a -t- il une méthode particulière pour récupérer les infos d'avancement d'un transfert quelquonque (pour moi c'est du réseau mais je pense qu'on doit pouvoir l'appliquer aussi à une simple copie de fichier). Je sais qu'il faut faire tourner un Thread en parrallèle de la tâche principale pour récupérer une valeur correspondant au pourcentage d'avancement du transfert, mais je ne sais pas comment générer cette valeur au fur et à mesure que le transfert progresse. Faut-il tout gérer en faisant dialoguer le client avec le serveur? Ca me paraît lourd car il faudrait que le serveur connaisse la taille des données qu'il doit recevoir, leur position dans le fichier pour reprendre le transfert à l'endroit où il s'est arrêté en cas de coupure, et calculer le pourcentage de données reçues avant de l'envoyer au client pour qu'il puisse afficher l'avancement. Si y'a pas d'autres moyen je m'y mettrai mais si y'a un truc qui peut me donner ces infos ça me simplifierait les choses.
Désolé pour le pâté, merci d'avance à ceux qui auront pris la peine de tout lire voire, de m'aider...
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 20 août 2007 à 23:08
salut,
il y a plusieurs choses :
-> pour le transfert, tu peux soit créer un thread qui fait le transfert (avec un threadstart ou un parametrizedthreadstart que tu passes au new thread pour indiquer la méthode à exécuter et éventuellement un argument à passer à cette méthode), soit utiliser un thread existant depuis threadpool avec la méthode QueueUserWorkItem à laquelle tu passes la méthode et un éventuel argument...
-> pour la progression, sur ta progressbar, tu définit le mini à 0, le maxi à la taille de ton fichier, le pas à la taille des paquets que tu envoies et tu fais un performstep après chaque paquet...avec surement la nécessité d'utiliser un appel Invoke pour éviter le crossthreadcalls...
-> pour la vitesse, tu peux définir un compteur comme variable membre de ta classe que tu incrémentes de la taille de ton paquet à chaque envoi et dans un timer, toutes les secondes, tu lis le compteur, ca te donne la vitesse dans la dernière seconde, tu le remets à 0...voir à utiliser lock sur la variable pour ne pas obtenir n'importe quoi du fait que le thread qui écrit n'est pas celui qui lit...
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 14 août 2007 à 21:27
salut,
pour compléter : tu ne peux pas savoir vraiment si le serveur a reçu tes données, donc, il suffit presque de compter les données que tu émets pour avoir la progression et dans la mesure où quand le tampon est plein ca bloque ton appli, tu peux avoir la vitesse...
churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008 20 août 2007 à 11:56
Désolé pour le temps de réaction, je reviens juste.
Effectivement mon interface graphique se bloque le temps du traitement du transfert, c'est pas terrible, surtout pour de gros fichiers. J'ai essayé de faire un "this.refresh" entre chaque envoi de paquet mais ça ne change rien, je pense qu'il faut construire un thread pour éviter cela, est-ce que je me trompe?
Sinon je commence à piger pour la barre de progression, mais pour la vitesse moins... Il faudrait mesurer le temps que met le pc à charger les données dans le buffer, ce qui revient à déterminer quand se bloque l'appli, c'est bien ça? Mais comment puis-je déterminer quand se bloque l'appli?