Classe MultiLoader : impossible d'interrompre un chargement de fichier distant
Par -Alexandre LEGOUT aka LAlex- le lundi, juin 28 2004, 14:32 - AS2 - Lien permanent
En revenant un peu au développement AS, je me rends compte du nombre de fonctionnalités que j'ai développé plusieurs fois, et travaille donc actuellement à me créer un ensemble de classes utilitaires qui m'éviteront de perdre du temps sur des développements répétitif, comme le fait tout programmeur un minimum organisé !
Par manque de temps et de projets nécessitant un investissement suffisant, je ne l'ai pas fait avant, et je m'y mets donc sérieusement ! ![]()
Je travaille actuellement sur une classe de preload, un peu à la manière de MovieClipLoader, mais me permettant de charger un ensemble de fichiers de différents types les uns aprés les autres avec les différents évènements correspondant. Ces fichiers pourraient être des SWF externes, des sons, des fichiers XML, voire des vidéos (si c'est faisable, je n'ai encore jamais eu l'utilité de la vidéo dans Flash). Le fait de ne pas les charger simultanément vient tout simplement d'une préoccupation d'optimisation de la bande passante et de priorisation des téléchargements.
Il s'agit donc pour moi de stocker l'ensemble des fichiers à charger, et de lancer une méthode de ma classe. Le problème est que j'aurais aimé pouvoir commencer par récupérer le cumul des tailles de mes fichiers. J'ai d'abord pensé à créer des LoadVars sur chaque fichier, et à les interrompre une fois la taille récupérée, sans charger la totalité du fichier.
Or il semble que la suppression d'un objet LoadVars (ou XML, et je soupconne les autres types "loadables") ne met pas fin au téléchargement. En effet, la méthode onLoad se lance malgré le fait que j'ai utilisé delete sur l'objet de type LoadVars qui m'a servi à récupérer la taille du fichier ... ![]()
this.tst = new LoadVars();
this.tst.onLoad = function() {
trace("OK");
}
this.tst.load("<a href="http://www.lalex.com/monfichier.jpg">http://www.lalex.com/monfichier.jpg</a>");
this.onEnterFrame = function() {
var tt = this.tst.getBytesTotal();
trace(tt);
if (tt != undefined) {
delete this.tst;
delete this.onEnterFrame;
}
}
La sortie donne undefined
undefined
undefined
undefined
28449
OK <= aprés quelques secondes
Aprés un parcours des archives de FlashCoders, il semble qu'aucune solution n'a été trouvée.
Apparemment, Flash crée automatiquement une référence vers l'objet, qui devient une référence anonyme si on le supprime, et empêche donc le garbage collector (ou ramasse-miettes en français :P) de faire son office ...
Si jamais entre temps, quelqu'un avait trouvé une solution à cet épineux problême, je serais ravi de l'apprendre ! ![]()
Pour revenir à ma classe, je prévois également, une fois la solution "à la queue-leu-leu" implémentée, de faire un système de pools de téléchargement, qui permettrait de télécharger un nombre défini de fichiers simultanément. Par exemple, on pourrait ainsi décider de ne pas charger plus de 3 fichiers à la fois. Ainsi, 3 fichiers se téléchargeraient, et le premier à avoir fini laisserait sa place au suivant, etc... Je prévois aussi de faire un système de téléchargement par catégorie (d'abord le XML, puis les clips, puis les sons, etc...)
Je mettrai bientôt la classe à disposition ici même ... ![]()
Commentaires
il te faut une "priority queue", le concept se trouve assez facilement sur le net
pour recuperer la taille du fichier a loader sans le charger completement
je ne vois que du script serveur
le LoadVars.load est un thread, on ne peut pas le "couper" amha,
a moins de couper la connection internet
quelques petit L qui trainent
: événemlents, optimlisation, à part ca, bon courage 
Salut,
dis-moi LAlex, t'a pas une méthode en php que tu peux utiliser ? --> tu passe par POST les fichiers à loader, tu récupère la taille avec php et tu renvoie le total à flash ....
@++
thecaptain > Oui, évidemment, ce serait même trés simple à mettre en place, mais ce n'est pas le but ... La je fait une classe Flash-only, dans le but de pouvoir la déployer sur n'importe quelle anim, sans contraintes côté serveur !
++ ^^
c'est bien ca le blem avec juste flash tu ne peux pas le faire, il te faut le coté serveur
il n'y a RIEN en flash qui permet de jouer avec la GC, d'arreter un thread en cours de route etc...
et recuperer un file size coté serveur sans charger le fichier, c'est facile quand meme je vois pas pourquoi tu veux faire sans
zwetan : c'est facile quand meme je vois pas pourquoi tu veux faire sans
pour que les gens comme moi qui ne font pas de php puissent utiliser la classe sans se soucier de la techologie côté serveur...
entre autres ... mais aussi pour ne pas me soucier de l'installation d'une techno serveur, pouvoir l'utiliser sur une anim standalone, ou plus simplement chez des hébergeurs n'ayant pas PHP !
Mais c'est pas grave, je ne fournirai pas la taille totale, tant pis ...
Salut Lalex, en fait si tu lis le thread, tu peux voir que le garbage collector fait effectivement son boulot mais APRES le onLoad. Comme le souligne bokel, http ne permet pas de stopper un chargement autrement qu'en coupant la connexion (comme quand on clique sur "arrêter" dans le navigateur ou qu'on change de page avant que l'actuelle ne soit chargée), comme c'est à ce niveau il faudrait que la fonction soit implémentée dans flash.
Ce genre de détails pénibles (avec les bugs de getBytesLoaded dans certaines versions du player sous mozilla) m'avaient fait abandonner l'idée de la queue de chargement ultime complètement versatile, et comme pour le reste j'eai plutôt tendance à en déveloper une au cas par cas sur mesure pour chaque projet suivant la nature des données à charger.
Si tu veux t'amuser à rajouter une killer feature à ta queue de chargement, fais une gestion de priorité des chargements aussi, c'est un peu ce dont tu parles dans les catégories mais je pense qu'une priorité dans l'absolue indépendamment du type des données est plus souple. Il y a des choix intéressants à faire pour modéliser le truc- à savoir choisir si tes priorités sont sans limite, ou si tu définis des niveaux comme pour les processus d'un os, mais bon il y a sûrement un truc pour modéliser ça proprement avec toutes vos design patterns là (moi je suis un vieux dinosaure procédural avec des béquilles objet alors les patterns ça me dépasse).
Fil des commentaires de ce billet