2009-12-16 3 views
1

Voici la prochaine question pratique.haskell chuncked lecture http

Je veux télécharger de gros fichiers du serveur http (mises à jour de base de données). Cette opération devrait bloquer l'interface utilisateur de l'utilisateur, l'empêchant d'entrer des données. Donc, le problème est de montrer la barre de progression de l'utilisateur, ce qui lui dira combien il reste à attendre.

En python, les objets de requête ouvrent un objet semblable à un fichier. Je l'ai lu par mandrin et rapporté à l'interface graphique par les fonctions de rappel.

Comment implémenter la même chose en haskell? comment obtenir la taille téléchargée actuelle et le signaler?

Répondre

1

Dans Haskell, vous le feriez de la même façon que la version python, mais les détails dépendent de la bibliothèque de l'interface graphique que vous utilisez.

Il existe quelques options concernant la détection de la quantité d'entrée qui est arrivée. Une façon consiste à utiliser IO paresseux. Ensuite, vous obtenez généralement une chaîne qui est construite paresseusement lorsque les données arrivent. Vous pouvez ensuite écrire des fonctions IO qui traversent la liste et met à jour l'interface utilisateur au fur et à mesure. Cela peut être une méthode assez pratique, mais les IO paresseux ont tendance à être très fragile, alors utilisez-le avec soin.

L'autre option consiste à utiliser une interface qui fournit l'accès aux blocs à leur arrivée. Je n'ai aucune expérience personnelle avec une telle bibliothèque mais la bibliothèque HTTP semble soutenir cela, dans le module de base.

Pour suivre la progression, il existe un bon module pour cela dans la bibliothèque MissingH: Data.Progress.Tracker.

Si vous donnez plus de détails sur votre scénario particulier, il serait possible de commenter davantage.

Bonne chance.

+0

Vous répondez quelque chose qui ressemble à "utiliser des sources, Luk". C'est ce que je ne voulais pas faire moi-même. Je vous accepte de répondre, mais en mettant -1 parce que je dois encore regarder à travers les sources. Un peu plus tard, je vais (peut-être) poster ici ce que j'ai cherché. –

+0

Mais vu votre vague description du problème, il n'est pas facile de montrer exactement comment le faire. Comme je l'ai dit, si vous donnez des détails plus concrets, il serait possible de donner une réponse plus utile. – svenningsson