(1) 2 »


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


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.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2