|
Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Bonjour,
Je voudrais afficher un message d'attente (animé) pendant un traitement long (requete SQL + remplissage d'une table mémoire)...
J'ai essayé l'ouverture d'une fenetre fille avec un champ image animé..Ca fonctionne mais l'animation ne se fait pas.
J'ai essayé une fenetre fille avec un libéllé animé. Idem
J'ai essayé avec un timer, pas de résultat non plus ..
Voici un peu de code
Fenetre principale :
nTimer = TimerSys(Clignote,100,1) Multitache () OuvreFille(fProgress) // Traitement long sReq = "SELECT AR_REF,AR_DESIGN, AR_PRIXVEN, FA_CODEFAMILLE FROM F_ARTICLE" bres = HExécuteRequêteSQL(Req1,"Sage",hRequêteSansCorrection,sReq) SI bres ALORS FichierVersTableMemoire(tArticles,Req1) Ferme(fProgress) FinTimerSys(1) SINON Erreur ("Erreur dans l'éxecution de la requéte") Ferme(fProgress) FinTimerSys(1) FIN
Timer Clignote PROCEDURE Clignote()
SI Position (fProgress.Libellé1,"...",1) = 0 ALORS fProgress.Libellé1 +=" ..." SINON fProgress.Libellé1 = "!!!" FIN
La fenetre fProgress est une fenetre libre, avec un libéllé et/ou un champ image animé
Comment avoir l'animation du texte ou de l'image pendant l'execution du traitement de la fenetre mère ??
Si quelqu'un a une piste de réflexion ou des idées, elles sont bienvenues..
Merci à tous
Cordialement
Contribution le : 09/12/2004 14:57
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 26/06/2002 16:24
De wdforge.org
Post(s): 2822
|
Bonjour Une solution serait d'avoir une première requête de comptage (Select COUNT....) qui vous donnera le nombre de ligne qui vont être récupérée dans la table. Ensuite à chaque TableAjoute, vous connaissez le nombre de ligne ajoutée et êtes donc en mesure d'afficher une jauge. // afficha ge dans la barre de message de la fenêtre courante
Jauge(nLigneAjoutéesTables,nNbLignesRequete,"Lecture des informations en cours...")
ps : penser au sablier.
Contribution le : 09/12/2004 16:11
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
bonjour,
Possible certes, mais pas dans l'esprit voulu..
la requete que je présente s'execute sur une connexion ODBC et peut être un peu longue, ensuite il y a remplissement de la table en une ligne de code avec FichierversTableMemoire...
Deux traitements qui prennent quelques secondes...Dans la solution proposée, le temps d'execution de la requete est tjs le meme, je peux affficher la jauge pendant la phase de remplissage en faisant une boucle et en mettant la jauge à jour durant cette boucle...cela allourdi le code
J'ouvre une fenetre fille, qui dispense un message d'attente, mais j'aurais voulu que ce message soit animé, or ce n'est pas le cas, l'animation de la fenetre fille ne se fait pas durant l'execution du code de la fenetre mère ...
L'utilisation d'un timer ne fonctionne pas non plus ...
Une autre alternative peut être ?
Contribution le : 09/12/2004 18:56
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Salut,
Essaye de mettre ton multitache avec un chiffre en negatif ca va permettre a ton annimation de se faire logiquement genre multitache(-1) au lieu de multitache() tout court.
a+++
Contribution le : 09/12/2004 19:29
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Slt,
Ben non, multitache(-x) ne resoud pas le pbl...
En fait les instructions HexecuteRequeteSQL et FicherVersTableMemoire, ne permettent pas l'execution simultanée et du coup bloquent les animations ...
peut être une autre solution
Merci
Contribution le : 09/12/2004 21:45
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour, Dans le projet que je suis en train de fir sur WMI j'ai été confronté au meme problème. J'ai utiliser un jauge animé livré en standard dans les images . Le traitement est effectué dans un thread secondaire ce qui ne fige pas l'animation car le traitement est exécuté en parallèle.
Sablier(Vrai)
MaJauge..Animation=Vrai
ThreadExécute("MonThread",threadNormal,"ExeProcedure")
ThreadAttend("MonThread") //Attente la fin de la procédure
MaJauge..Animation
MaJauge..Valeur="Wait-Blue.gif" //image d'origine (départ)
MaJauge..Animation=Faux
Sablier(Faux)
Contribution le : 10/12/2004 01:25
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
DSI WDF
Inscrit: 03/12/2004 07:46
Post(s): 235
|
Je confirme la réponse de RB. J'ai posé la même question que toi, il ya quelque temps sur ce forum. La seule solution pour que l'animation fonctionne que celà soit un libellé animé ou une image c'est d'éxécuter la requête dans un thread. //------------------------------------ Exemple : ThreadExécute("UnNomDeThread",threadNormal,"TaProcedure") TonChampsImage..visible = vrai ThreadAttends("UnNomDeThread") TonChampsImage..visible = faux
Procedure TaProcedure() // Execution de ta requête
Remarque : celà présente l'avantage que tu n'est pas obligé d'avoir une fenêtre secondaire pour l'animation.
A+
Contribution le : 10/12/2004 07:42
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Merci pour toutes ces informations, je vais de ce pas essayé la technique du thread, qui me semble une piste intéressante et pleine de promesses...
Cordialement, Jc
Contribution le : 10/12/2004 12:40
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Bonjour, L'idée du thread est bonne, je l'ai mise en place, mais je me heurte à un autre probleme. La procédure appelée par le Thread, contient du code d'exectution d'une requete : HexecuteRequeteSQL. J'ai déclaré dans la procédure locale, une source de données qui doit être remplie par le resultat de la requete. Cette source doit ensuite servir à remplir une table mémoire avec FichierVersTableMemoire. Le hic, ce que la procédure s'arrete à cause d'une erreur sur la source de données. Windev me dit que la source de données n'existe pas. Citation : PROCEDURE Requete() bres est un booléen sReq est une chaîne Req1 est une Source de Données sReq = "SELECT AR_REF,AR_DESIGN, AR_PRIXVEN, FA_CODEFAMILLE FROM F_ARTICLE" bres = HExécuteRequêteSQL(Req1,"Sage",hRequêteSansCorrection,sReq) SI bres ALORS FichierVersTableMemoire(tArticles,Req) TableSelectPlus(tArticles,1) Case4..Valeur = "MAJ à " + HeureVersChaine(Maintenant(),"HH:MM:SS") SINON Erreur ("Erreur dans l'éxecution de la requéte") FIN SINON Erreur ("Connexion non établie") FIN
A l'execution...l'animation se fait et ensuite l'erreur suivante : Erreur à la ligne 16 du traitement Procédure locale Requete. Vous avez appelé la fonction FichierVersTableMemoire. L'objet Req1 n'a pas été trouvé. Code de la procédure principale Citation : ThreadExécute("UnNomDeThread",threadUtiliseHyperFile,"Requete") Image1..Visible = Vrai ThreadAttend("UnNomDeThread") Image1..Visible = Faux
Si quelqu'un sait quelque chose à ce sujet ... Merci d'avance
Contribution le : 10/12/2004 14:00
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 26/06/2002 16:24
De wdforge.org
Post(s): 2822
|
Si l'idée sur thread est bonne elle montre une certaine méconnaissance . Je m'explique... hExecuteRequete pose tant de problème justement parce qu'elle lance elle même plusieurs threads... 1 pour valider la requete (syntaxe) 1 pour récupérer les données etc. Coté programme, la source n'est visible que lorsque le moteur Hyperfile est en mesure de vous délivrer la source AVEC TOUTES les données... C'est pourquoi nous n'utilisons pas les threads pour mesurer la progression de l'exécution de la requête. Donc sauf si WD9 ajoute une gestion de jauge à l'exécution des requetes, il faudra se contenter de ce que l'on vous a présenté précédement. Je vous laisse, si vous voulez la charge de leur présenter la RequeteAuST pour soumettre la demande... bien que le lien sur cette discussion peu y être intégré.
Contribution le : 10/12/2004 14:21
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Idée: Déclarer votre source de données en global dans la fenetre ou au moins dans la procédure qui appel le thread, puis passer lui le Source de données en paramètres. Vous pouvez faire de meme en lui passant le nom de la fenêtre avec le nom de la table à mettre à jour sous forme:
ThreadExécute("UnNomDeThread",threadUtiliseHyperFile,"Requete",Req1,"MaFenetre.Table1")
Contribution le : 10/12/2004 14:38
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
RE-Bonjour, Au sujet du passage de parametres... Je fais ceci dans le code d'initialisation de la fenetre: Citation : ThreadExécute("UnNomDeThread",threadUtiliseHyperFile,"Requete",Req)
Req est une source de données global à la fenetre d'appel Dans la procédure Requete Citation : PROCEDURE Requete(pReq) bres est un booléen sReq est une chaîne
sReq = "SELECT AR_REF,AR_DESIGN, AR_PRIXVEN, FA_CODEFAMILLE FROM F_ARTICLE" bres = HExécuteRequêteSQL(pReq,"Sage",hRequêteSansCorrection,sReq) SI bres ALORS FichierVersTableMemoire(tArticles,pReq) TableSelectPlus(tArticles,1) Case4..Valeur = "MAJ à " + HeureVersChaine(Maintenant(),"HH:MM:SS") SINON Erreur ("Erreur dans l'éxecution de la requéte") FIN
Ce qui pose probleme c'est toujour FichierVersTableMemoire qui affirme ne pas connaitre la source de données Req, bien que passée en paramétre et déclarée en globale... Par contre j'ai testé une autre méthode avec l'éditeur de requète. Et la ca fonctionne si je déclare une requéte à l'éditeur, que j'execute la requete, et que j'utilise le resultat pour FichierVersTableMemoire ... Ainsi donc, qu'est ce qui cloche ?? Cette soumission à votre sagacité ;) Cordialement Jc
Contribution le : 10/12/2004 15:11
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Mets ces lignes en commentaire pour l'instant, et regarde une fois le thread terminé si ta source de données contient bien des données. Si tel est le cas tu peut afficher tes données après le thread etant données que ce n'est pas l'affichage qui prends le plus de temps Tu peut aussi essayer en remplacant:
FichierVersTableMemoire(tArticles,pReq)
TableSelectPlus(tArticles,1)
par
FichierVersTableMemoire(<Nom de la fenetre>.tArticles,pReq)
le tableselectplus peut être mit apprès l'exécution du thread.
Contribution le : 10/12/2004 17:21
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Yop,
Pour avoir expérimenté la chose rien n'y fait ... Faut croire que la fonction FichierVersTM utilise un thread // dont le résultat n'est pas accessible :)
Une solution, mettre le FichierVersTM dans une procédure, dans ton thread utiliser un PostMessage() récupérer par un évènement perso WM_USER+X qui lui appelle la procéduré contenant le FichierVersTM ... Et là yop miracle la table se remplit :)
++ramses :)
Contribution le : 13/12/2004 12:49
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour Ramses,
Merci pour cette astuce qui aura bonne place dans notre FAQ.
Contribution le : 13/12/2004 16:03
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
DSI WDF
Inscrit: 03/12/2004 07:46
Post(s): 235
|
Bonjour à tous si l'attente n'est pas trop longue et que le but, comme dans mon cas, n'est que d'avoir une animation rassurant l'utilisateur. ma machine n'est pas plantée ? du style "Veuillez patientez" animé. Tu peux, tout de suite derrière le thread qui lance la procédure, utiliser la commande ThreadAttend et atendre la fin de la requête avant de continuer ton traitement. Ainsi tu es certain que ta source de donnée existe au moment ou tu en as besoin L'intéret du thread c'est qu'il ne bloque pas le traitement en cours mais c'est aussi son inconvénient
Contribution le : 14/12/2004 07:44
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Bonjour,
l'idée de Ramses est surement trés lumineuse, mais avec un petit exemple complet à l'appui, cela serait bcp plus parlant...surtout en ce qui concerne l'envoi de message ...
Alors Ramses, si le coeur t'en dit, un petit exemple ne serait pas pour nous déplaire ...
Merci d'avance ...
Cordialement, Jc
Contribution le : 15/12/2004 00:00
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
Yop,
Faut que je me reveilles de si bon matin :)
Je ne sais pas si l'idée est lumineuse mais je l'utilises depuis longtemps dans mon logiciel et cela marche très bien...
- Déclarer une constante type WM_MYEVT ayant une valeur > WM_USER (genre WM_USER + 0x0A0F, vérifier simplement que la valeur n'est pas déjà utilisée)
[ - Créer une procédure RemplirTable() avec le code de remplissage (dont le FichierVersTableMemoire()) ]
- Créer une procodure WM_Perso(Message, wParam, lParam) avec le code de renvoie :
SI Message=WM_MYEVT ALORS RemplirTable()
[ vous pouvez aussi remplir la table ici ] [ vous pouvez rajouter des contrôles sur wParam & lParam ]
- Déclarer la gestion de l'évènement dans la fenêtre : Evénement("WM_PERSO", "MyWindow", WM_MYEVT)
- Dans le thread de traitement après l'exécution de la requête faire un PostMessage(Handle(MyWindow), WM_MYEVT, wParam, lParam) pour déclencher le code de remplissage
++ ramses :)
Contribution le : 15/12/2004 09:26
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Anonyme
|
RE-bonjour,
Merci Ramses pour ce complément d'informations...Je tenterais de mettre en place cette solution pour améliorer l'ergonomie de mon appli...
Bonne journée
Cordialement Jc
Contribution le : 15/12/2004 12:17
|
|
|
Re: Message d'attente pendant un traitement long ..Comment faire ?? |
|
Stagiaire WDF
Inscrit: 16/09/2004 11:28
Post(s): 5
|
Salut,
Je cherchais également comment faire j'ai testé la solus de ramses mais la procédure RemplirTable ne s'execute pas.
Le PostMessage de le thread n'aucun effet sur la fenêtre.
Un exemple concret pourrait etre util.
Merci
Contribution le : 16/12/2004 13:13
|
|
Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|