Question

Donc, je fais une simple analyse pour obtenir une liste de tous les dossiers d’un disque dur (c: \ windows et c: \ windows \ system32 sont considérés comme des entrées séparées). Si je voulais fournir une barre de progression pour cette tâche d'une à deux minutes, comment pourrais-je le faire? C’est-à-dire que je sais comment faire évoluer la barre de progression, mais je ne sais pas comment déterminer la quantité de travail à effectuer.

Modifier: notez qu'effectuer une prévisualisation n'est PAS une solution, car celle-ci ne fait qu'obtenir une liste de dossiers et qu'une prévisualisation prendrait tout autant de temps.

Exemple de code ci-dessous. Il faut moins de 2 minutes pour fonctionner en mode minimal sur mon système, mais moins de 10 secondes pour s'exécuter une seconde fois en raison de la mise en cache de l'accès au disque. J'ai créé des variantes basées sur la pile plutôt que sur la récursivité.

Un mécanisme que j'ai trouvé qui n'est probablement pas fiable à 100% mais qui est beaucoup plus rapide que mon analyse consiste à diriger vers & "dir / s / ab / b &"; à mon programme et compte les occurrences de newline. Dir réalise une sorte de magie qui numérise beaucoup mieux mon disque dur que mon programme, mais je ne sais pas ce qu’est cette magie.

class Program
{
    static void recurse(string pos)
    {
        DirectoryInfo f = new DirectoryInfo(pos);
        try
        {
            foreach (DirectoryInfo x in f.GetDirectories("*"))
            {
                recurse(x.FullName);
            }
        } catch (Exception) {}
    }
    static void Main(string[] args)
    {
        recurse("c:\\");
    }
}
Était-ce utile?

La solution

Si vous ne pouvez pas rediffuser la structure de répertoires car cela prendrait aussi longtemps que d’exécuter la tâche, le mieux que vous puissiez faire est de deviner le nombre de dossiers. Sérieusement.

Peut-être pouvez-vous utiliser un algorithme basé sur l'historique (par exemple, la dernière fois que j'ai fait cela, il y avait 150 répertoires au total, alors qu'il y avait 10 répertoires de niveau supérieur; par conséquent, une bonne hypothèse serait 15 fois le nombre actuel de répertoires de premier niveau. répertoires de niveau).

Une autre façon de dire à un utilisateur quelque chose va prendre un certain temps (sans savoir exactement combien de temps) consiste à utiliser un compte à rebours. Même si vous avez deviné que quelque chose prendra plus de temps que cela ne le sera réellement (disons 5 minutes quand c'est vraiment une tâche de 3 minutes), au moins l'utilisateur sait à peu près combien de temps cela va prendre. Et ils seront plus heureux quand ça finira plus vite qu'on ne le leur dit. Le seul inconvénient, bien sûr, est que si l’on devine mal de l’autre côté, c’est-à-dire si quelque chose prend plus de temps que prévu. Ensuite, ils sont assis et attendent que quelque chose se termine qui (dans leur esprit) aurait déjà dû se terminer.

Autres conseils

Si vous devez créer une barre de progression et que vous ne disposez pas du temps nécessaire pour collecter des informations précises, vous ne pourrez pas créer une barre de progression parfaite. Avec cette hypothèse à l’esprit, vous pouvez toujours créer une barre de progression qui n’est pas complètement inexacte.

Par exemple, vous créez une fonction qui subdivise la barre de progression en fonction du nombre de sous-répertoires du répertoire en cours. Donc, si votre répertoire racine a 10 sous-répertoires, allouez 10% de la barre de progression à chacun de ces répertoires. Ensuite, entrez dans le premier sous-répertoire et comptez ses sous-répertoires. S'il en a 5, affectez 20% des 10 premiers% de la barre de progression à chacun de ceux-ci (2% de la barre de progression totale). Continuez ainsi jusqu'à atteindre un répertoire sans sous-répertoires, effectuez votre traitement et augmentez la barre de progression, quelle que soit sa fraction.

Chaque% de la barre de progression ne représente pas le même travail effectué par l'algorithme, mais compte tenu de vos contraintes, je doute que vous puissiez faire beaucoup mieux.

Ne l'utilisez pas. Essayez quelque chose de plus approprié, comme une animation en rotation ou une barre de style Kitts: http://en.wikipedia.org/wiki/ KITT .

Vous pouvez le faire de plusieurs manières. Un processus simple qui pourrait ne pas être précis à 100%.

Avant de commencer, obtenez un nombre de fichiers, puis utilisez-le pour calculer le pourcentage de réalisation. Une fois le traitement terminé, les fichiers X actualisent la progression. Accordé, il y a un coût de performance de la recherche. Vous pouvez peut-être obtenir un nombre de répertoires racine et mettre à jour votre progression au fur et à mesure.

Une autre option pourrait consister simplement à enregistrer le nombre de & "Dernière exécution &"; détails, et utilisez-le pour calculer un pourcentage, encore une fois, pas nécessairement précis à 100%, mais une option.

Je suppose que quelques autres choses qui me viennent à l’esprit sont simplement de montrer à l’utilisateur un & "en cours &"; dialogue et même pas essayer d'obtenir un pourcentage. Sinon, montrez simplement le répertoire de travail en cours, en indiquant que vous progressez.

J'ai essayé de récupérer le stdoutput de " dir/ad/b/s c:/ " et compter le nombre de lignes. C'est assez rapide. C'est assez digne de confiance pour être utilisé dans une barre de progression, mais pas assez pour être utilisé comme liste de répertoires.

Vous pouvez créer une barre de progression en incrémentant Maximum & amp; Propriétés de valeur. Si votre propriété Maximum a été initialement définie sur 100, incrémentez votre maximum & Amp; Valeur de 1 par exemple, vous aurez donc les valeurs énumérées ci-dessous ...

         Maximum    Value 
Tick1:    101          1   - 1% 
Tick2:    102          2   - 2%
Tick3:    103          3   - 3% 
TickN:    100+n        n 
Finish    100+n      100+n - 100%  --> force to fill the progress bar

Vous pouvez faire des essais sur votre valeur maximale initiale pour que la barre de progression se déplace plus doucement.

J'ai utilisé la méthode de Catchwa. J'ai défini la plage de progression sur 14000 car les systèmes d'exploitation de mon système ont à peu près autant de répertoires. Lorsque j'ai trouvé un répertoire vide, j'ai ajouté le montant fractionnel pondéré à la barre de progression. La quantité étant basée sur la profondeur et normalisée avec la plage. Dans chaque traversée de sous-arbre, vous vous retrouvez avec un répertoire vide et le poids de tous les sous-répertoires vides d'un répertoire est composé du poids du répertoire, mais divisé en morceaux. Lorsque j'ai trouvé un répertoire non vide, j'ai stocké le nombre de sous-répertoires dans une carte. Je suis, en utilisant Qt:

emit findProgressBar_setRange(14000); ... if (dir.size()) { m_dirsAtDepth[++m_depth] = dir.size(); } else { qreal product = 1.00; for (int i = 1; i <= m_depth; ++i) { product *= m_dirsAtDepth[i]; } int x = qRound((1.00 / product) * 14000); emit findProgressBar_addValue(x); }

Il fonctionne plutôt bien et n’est pas cher. J'offre également à l'utilisateur une option de barre de progression précise dans laquelle je compte d'abord le nombre total de répertoires, ce qui peut coûter cher.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top