Traitement de traitements longs.

Soyez le premier à donner votre avis sur cette source.

Vue 7 086 fois - Téléchargée 1 099 fois

Description

(Héhéhé, j'aime bien le titre...)

Salut,
Quand votre application doit effectuer des traitements longs, il y a quelques règles de bon sens à respecter :

1) Indiquer à l'utilisateur qu'un long traitement commence. C'est le minimum pour que l'utilisateur ne "tue" pas la tâche en disant 'encore un bazar qui plante...'
2) Lui indiquer par une barre de défilement que ça continue de bosser et que c'est pas planté au milieu du gué.
3) Si possible lui indiquer le temps restant. Pratique pour pipi, café...( j'en connais même un qui en profite souvent pour se mijoter un petit chili con carne...).
4) Lui permettre d'annuler le traitement en cours si c'est pas un grand patient.

J'ai donc regroupé toutes ces règles dans une unité (Wait) que vous pourrez utiliser à votre guise.
Dans Main, il y a quelques exemples d'utilisation et de mise en oeuvre.
Dans la pratique, on ne donnera bien sûr pas les choix proposés ici à l'utilisateur; ce qui simplifiera considérablement le code d'appel.

Conclusion :


Inspiré des conseils de Olivier DAHAN dans son livre "Delphi 7 Studio".
Merci à lui.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Ah oui, j'allais oublier : quand on réalise une application console, il n'y a guère moyen de faire autrement que de faire appel à ces fameuses fonctions de callback (no forms !)
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Salut à tous,

"Pour ce qui est des applications threadées, j'avoue que ça dépasse encore mes limites."
Je crois que c'est davantage une question d'appréhension que de difficultés techniques tant la mise en oeuvre avec Delphi est simple. Il suffit d'éviter quelques pièges grossiers et l'on obtient une application qui continue de répondre même en cas de traitement long. Par ce côté, ça rassure déjà l'utilisateur final.

Tu t'est inspiré du code d'Olivier DAHAN : je vois que monsieur a de bonnes lectures :)
Mais ce code, et vous êtes plusieurs à l'avoir fait remarquer, est conçu pour un usage simple et rapide. Il ne saurait régler tous les cas possibles.

Je suis assez étonné que personne n'ait mentionné l'utilisation de callbacks, encore plus simples à mettre en oeuvre pour un résultat plus facilement personnalisable. En effet, tant qu'on transmet une fonction ou une méthode dont la signature correspond à celle attendue par la fonction appelée, on peut faire varier les effets d'une progression sans avoir à concevoir de fiches spécifiques.
Enfin, peut-être que cetet notion de fonction callback est quelque chose qui se perd...
Après tout, pourquoi faire simple quand on peut faire compliqué ? :(
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
"(pas idiot non plus le type ^^)"
C'est une pensée qui ne m'a jamais effleuré ! :)
D'autant que tu as parfaitement compris le truc de ce code. Et je te remercie de t'être penché autant sur mon travail.

Pour ce qui est des applications threadées, j'avoue que ça dépasse encore mes limites. Je n'ai jamais eu vraiment besoin d'y avoir recours (sauf pour des connexions TCP/IP). Et comme je n'ai aucune base en info et que je suis autodidacte, j'ai besoin de me retrouver devant une situation concrète.
Nul doute que ça viendra un jour, mais pour le moment...

Je suppose que ce sera un problème de synchronisation des tâches. Et peut-être que dans ce cas, un traitemennt du problème spécifique à l'application sera plus optimisé. Je ne sais pas, en fait. J'y reviendrai lorsque j'aurai fait qq progrès de ce côté-là, ok? ^ ^
"beaucoup d'entre vous ont des doutes sur ce code"

Tiens, j'ai l'impression de faire parti du lot ! ^^
Le truc, c'est que je n'ai pas compris comment m'en servir dans le cas d'un VRAI téléchargement de fichier sur Internet. Ta simulation est bonne, le calcul du temps restant aussi mais il manque encore un petit quelque chose pour que je puisse comprendre.

En fait, si, j'ai compris (pas idiot non plus le type ^^). Si on utilise un TIdHTTP il suffit de mettre Initialiser(...) et OuvrirAttente(...) dans le OnBeginWork, le MAJ(...) dans le OnWork et le FermerAttente(...) + Finaliser(...) dans le OnEndWork.

Bon. De ce côté là c'est OK. Mais pour la fin, tu fais comment ? Il faut tester la valeur de FinDemandee dans le OnWork et demander l'annulation si demandé ? Logiquement oui (et ça marche en plus ^^).

Cependant, si ma tâche est threadée, je fais comment ? Il faudrait que je lise la variable FinDemandee pour savoir si c'est la fin. Jusque là, c'est OK. Mais si ce n'est pas la fin, je dois synchronizer le thread avec le thread principal pour pouvoir mettre à jour la barre de progression. Conclusion: je perds du temps.

Ce n'est pas impossible pour autant même si ce n'est pas 100% optimimsé.

---------------------------------------------------------------

Maintenant, imaginons quelque chose de beaucoup plus complexe.
J'utilise la (fameuse ?) API DeviceIOControl() pour faire plein de trucs sympas et bizarres qui prennent du temps.
Cette fonction ne crée aucun callback et la seule façon de l'arrêter est de faire un CancelIO().
Il est possible d'obtenir l'avancement avec GetQueuedCompletionStatus().
Bon.
Comment je m'y prend moi pour gérer ce cas ?

Vu ton code, une seule solution:
- Je lance le tâche (tout le bazar de début des API Windows...)
- Je crée une boucle qui a pour rôle d'appeler périodiquement GetQueuedCompletionStatus()
- A chaque renvoi d'avancement, je mets à jour la progressbar.
- Si l'utilisateur demande d'annuler, il y aura un test dans la boucle qui se chargera d'appeler CancelIO().

Et ça marche ! Mais c'est drôlement compliqué ! Et en plus, tout se fait dans le thread principal.
N'y aurait-il pas un moyen plus simple de faire la même chose ?
C'est cela que je te demande...

PS: Je sais, je vais chercher vraiment loin, mais c'est pour voir jusqu'où tu es capable d'améliorer ta source ! ça n'enlève rien à sa qualité et à l'estime que j'ai d'elle !
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Je me trompe peut-être, mais il me semble que beaucoup d'entre vous ont des doutes sur ce code ;)

Donc, pour en avoir le coeur net, j'ai fait une MAJ en ajoutant une simulation de chargement de fichier sur Internet.

Conclusion, après quelques estimations fantaisistes dans les premières secondes, l'application donne une estimation très correcte du temps restant. Et plus le temps passe, plus l'estimation s'affine.
Après réflexion, il ne semble pas qu'on puisse faire plus précis.

En espérant avoir dissiper quelques doutes... :)
Afficher les 16 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.