|
[WD20] Actualiser table en "temps réel" |
Started by Adrien Bonnel, Aug., 02 2015 10:09 PM - 24 replies |
| |
| | | |
|
| |
Posted on August, 02 2015 - 10:09 PM |
Bonjour, Quelqu'un connaîtrait-il une solution sans passer par un timer pour actualiser automatiquement une table sur un temps donné ou quand la base de données a subi des modifications ? J'utilise l'accès natif MySQL et non pas HFSQL. Merci bien . |
| |
| |
| | | |
|
| | |
| |
Posted on August, 03 2015 - 3:03 PM |
Bonjour Adrien
pourquoi "sans passer par un timer" ?
Cordialement
-- Fabrice Harari Consultant WinDev, WebDev et WinDev Mobile International
Disponible : WXShowroom.com, WXReplication (open source) Bientôt : WXEDM (open source) Plus d'information sur http://fabriceharari.com
On 8/2/2015 2:09 PM, Adrien Bonnel wrote:
Bonjour, Quelqu'un connaîtrait-il une solution sans passer par un timer pour actualiser automatiquement une table sur un temps donné ou quand la base de données a subi des modifications ? J'utilise l'accès natif MySQL et non pas HFSQL. Merci bien . |
| |
| |
| | | |
|
| | |
| |
Registered member 204 messages Popularité : +4 (8 votes) |
|
Posted on August, 03 2015 - 3:11 PM |
Sans passer par un timer ça risque d'être compliqué.
Je sais pas si l'utilisation des sockets est bien compliqué en windev. Recevoir une notification sur un événement donné (la BD change).
Mais si tu veux uniquement t'éviter un gros traitement de call de BD lourd, j'ai une petite idée.
Dans la BD, tu créer une table de 1 colonne, 1 ligne, et tu y stock la date de la dernière modification de la table désiré. (cette table sera mit à jour via un trigger sur la table désiré).
Dans ton application avec un timer (et oui) tu ne fais qu'aller voir la date de dernière modification si elle est supérieure à la dernière fois que tu as faite une mise à jour.
Si oui, tu refresh la table.
Ça utilise quand même un timer, mais au moins, tu refresh pas ton tableau au complet sans arrêt pour aucune raison. |
| |
| |
| | | |
|
| | |
| |
Posted on August, 03 2015 - 4:58 PM |
Fabrice Harari a écrit : > pourquoi "sans passer par un timer" ?
Mathieu BROUSSEAU a écrit :
Sans passer par un timer ça risque d'être compliqué.
Bonjour, Disons que j'avais déjà essayé la solution du timer, mais je la trouvais "lourde". Je pensais que le traitement aurait pu être allégé avec les threads voire les sockets, mais je n'ai pas trop compris le principe de fonctionnement, surtout pour le mettre en place dans mon cas. Si vous me dites qu'il n'y a pas d'autres façons de procéder, tant pis je m'y résignerai . |
| |
| |
| | | |
|
| | |
| |
Posted on August, 03 2015 - 6:31 PM |
Bonjour Adrien,
c'est quoi "lourde" ?
Ton programme doit régulièrement vérifier s'il y a du nouveau, et si oui, l'afficher.
"Régulièrement" = avec un timer, et ce n'est pas "lourd" du tout. Maintenant, si le traitement de vérif et mise à jour est mal écrit, ca peut devenir lent ou pas pratique pour l'utilisateur, mais le timer n'y est pour rien.
Bien sur le timer peut être dans un thread secondaire, mais le principe est le même.
Cordialement
-- Fabrice Harari Consultant WinDev, WebDev et WinDev Mobile International
Disponible : WXShowroom.com, WXReplication (open source) Bientôt : WXEDM (open source) Plus d'information sur http://fabriceharari.com
On 8/3/2015 8:58 AM, Adrien Bonnel wrote:
Fabrice Harari a écrit : pourquoi "sans passer par un timer" ?
Mathieu BROUSSEAU a écrit : Sans passer par un timer ça risque d'être compliqué.
Bonjour, Disons que j'avais déjà essayé la solution du timer, mais je la trouvais "lourde". Je pensais que le traitement aurait pu être allégé avec les threads voire les sockets, mais je n'ai pas trop compris le principe de fonctionnement, surtout pour le mettre en place dans mon cas. Si vous me dites qu'il n'y a pas d'autres façons de procéder, tant pis je m'y résignerai . |
| |
| |
| | | |
|
| | |
| |
Registered member 281 messages Popularité : +24 (26 votes) |
|
Posted on August, 03 2015 - 6:50 PM |
Bonsoir,
Un timer c'est un peu "rude" pour l'utilisateur car si la requete est longue il va voir l'application figée sans comprendre pourquoi...
Le plus "fin" est d'utiliser un thread pour effectuer ma requete et récupérer les modifications et de mettre a jour la table en faisant une demande de mise a jour (autant utiliser les nouvelles fonctions de la 20) ou alors en gerant cela par événements avec un PostMessage pour prevenir le thread principal de l'application de mettre a jour la table. Car seul le thread principal doit gerer l'IHM. |
| |
| |
| | | |
|
| | |
| |
Registered member 204 messages Popularité : +4 (8 votes) |
|
Posted on August, 04 2015 - 2:20 PM |
Ce que tu fais avec un timer c'est la requête qui vérifie s'il y a du nouveau. Si cette requête est lourde soit ton serveur est monté sur un pentium 133 ou ta requête de " Il y a du nouveau " est mal conçu. |
| |
| |
| | | |
|
| | |
| |
Posted on August, 04 2015 - 4:34 PM |
Bonjour,
il me semble que la lst 82 traite des notifications push depuis le serveur via socket. Je ne l'ai jamais mis en place, mais je pense que c'est une manière élégante de signaler la mise à jour d'un fichier. Il faut cependant, pour que ce soit pleinement efficace, que tous les clients intègrent cette fonctionnalité.
Cordialement.
Jonathan. |
| |
| |
| | | |
|
| | |
| |
Posted on August, 07 2015 - 11:05 AM |
Intéressant cette histoire de LST 82, je vais contacter PC Soft à la rentrée (scolaire) pour savoir si elle peut convenir à mon besoin et, auquel cas, je verrai pour la commander.
Sinon, j'ai procédé ainsi :
Déclarations globales de la fenêtre contenant ma table
SI Timer("Refresh_Requests", Val(INILit("Table", "RefreshTime", "", sConfig)) * 100, 1) = 0 ALORS Erreur("Création du timer impossible") FIN
Procédure Refresh_Requests :
Procedure Refresh_Requests()
ExécuteTraitement(Table, trtInit) |
| |
| |
| | | |
|
| | |
| |
Registered member 204 messages Popularité : +4 (8 votes) |
|
Posted on August, 07 2015 - 2:17 PM |
Tout dépendamment de ce qui se trouve dans ton code d'initialisation de ta table.
Si tu recharges complètement ta table, c'est sur et certain que c'est lourd comme " Solution ".
Essaie plutot avec
Procedure Refresh_Requests()
SI Procedure_Qui_Verifie_Si_Modif_Dans_La_BD() = Vrai ALORS ExécuteTraitement(Table, trInit) FIN
il te reste plus qu'à créer la procédure qui fait une requête à la BD pour savoir s'il y a des modifs et retourne vrai ou faux. |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on August, 26 2015 - 8:28 PM |
Bonsoir, J'ai préféré avancer sur le reste afin de revenir sur cette partie plus tard, histoire de ne pas me pénaliser niveau temps.
J'ai donc créé un thread pour tester et j'ai une erreur ("Création du timer impossible") Voici le code, si jamais vous voyez où j'ai pu me planter :-/.
Dans la partie "Fin d'initialisation" de ma fenêtre :
ThreadExecute("Thread_" + MoiMême..Nom, threadNormal, "Thread_Refresh")
Procédure "Thread_Refresh"
Procedure Thread_Refresh()
SI TimerSys("Table_Refresh", RegistreLit("HKEY_CURRENT_USER\Software\Azumi\Win_Main", "Table_Refresh_Time"), 1) = 0 ALORS Erreur("Création du timer impossible") FIN
Procédure "Table_Refresh"
Procedure Table_Refresh()
sTables est une chaîne = "Table, Table_Break"
POUR TOUTE CHAINE sTable DE sTables SEPAREE PAR ", " Trace(sTable) ExécuteTraitement(sTable, trtInit) FIN
La valeur de "Table_Refresh_Time" en base de registre est de 100, et inscrite dans une clé de type DWORD 32 bits.
Merci d'avance .
PS : J'ai un autre effet Kiss-Kool lié à mon rafraichissement automatique, mais j'y viendrai quand celui-ci sera résolu. |
| |
| |
| | | |
|
| | |
| |
Registered member 281 messages Popularité : +24 (26 votes) |
|
Posted on August, 26 2015 - 9:50 PM |
Plutot logique... On ne lance pas un timer dans un thread secondaire |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on August, 28 2015 - 7:33 AM |
Euh comment peut-on faire dans ce cas ? :-/ |
| |
| |
| | | |
|
| | |
| |
Posted on August, 28 2015 - 12:17 PM |
Bonjour
On lance le timer dans le thread principal -OU- on utilise un thread secondaire
Cordialement
-- Fabrice Harari Consultant WinDev, WebDev et WinDev Mobile International
Disponible : WXShowroom.com, WXReplication (open source) Bientôt : WXEDM (open source) Plus d'information sur http://fabriceharari.com
On 8/27/2015 11:33 PM, Adrien BONNEL wrote: > Euh comment peut-on faire dans ce cas ? :-/ |
| |
| |
| | | |
|
| | |
| |
Posted on August, 28 2015 - 6:54 PM |
Bonjour,
Peut-être, est-il possible d'utiliser HVersion(nomfichier). (dans une procédure lancée dans un timer ou à l'occasion d'un événement à déterminer en fonction de l'application ou quand l'utilisateur le demande)
Je n'ai jamais essayé avec autre chose que HFSQL mais cette fonction semble utilisable aussi avec les accès natifs. |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on August, 28 2015 - 8:21 PM |
Fabrice Harari a écrit :
On lance le timer dans le thread principal -OU- on utilise un thread secondaire
Euh ce n'est pas ce que j'ai tenté de faire juste au-dessus ? o_O |
| |
| |
| | | |
|
| | |
| |
Registered member 4 messages |
|
Posted on August, 29 2015 - 7:26 AM |
le plus simple est de vérifier avec HVersionFichier("Le_Fichier_en_Question") dans une procédure avec un Timer.
-- Jean Francois Piechaud |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on August, 29 2015 - 7:56 AM |
Bonjour Jean-François, Euh je ne trouve pas cette fonction dans la documentation. Vous auriez un lien s'il vous plaît ? De même, est-ce une fonction compatible avec l'accès natif MySQL ? |
| |
| |
| | | |
|
| | |
| |
Registered member 281 messages Popularité : +24 (26 votes) |
|
Posted on August, 29 2015 - 1:08 PM |
Bonjour,
Ce n'est pas bien sorcier pourtant
ThreadExecute("Thread_" + MoiMême..Nom, threadNormal, "Table_Refresh")
Procedure Table_Refresh()
sTables est une chaîne = "Table, Table_Break"
POUR TOUTE CHAINE sTable DE sTables SEPAREE PAR ", "
ExécuteThreadPrincipal(MAJTable, sTable) FIN
Procedure MAJTable(LOCAL sTable est une chaîne) ExécuteTraitement(sTable, trtInit)
Il y a encore peut-être des petites erreurs car j'ai fais cela vite fait de tete mais tu as le gros du taff |
| |
| |
| | | |
|
| | |
| |
Posted on August, 29 2015 - 1:22 PM |
Non, tu as essayé de créer un timer DANS le thread secondaire, au lieu de CHOISIR entre un timer et un thread secondaire
On 8/28/2015 12:21 PM, Adrien BONNEL wrote:
Fabrice Harari a écrit : On lance le timer dans le thread principal -OU- on utilise un thread secondaire
Euh ce n'est pas ce que j'ai tenté de faire juste au-dessus ? o_O |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on August, 29 2015 - 11:33 PM |
J'essaie cela demain, merci bien . |
| |
| |
| | | |
|
| | |
| |
Posted on February, 23 2018 - 9:05 AM |
j'ai besoin de votre contact damien |
| |
| |
| | | |
|
| | |
| |
Posted on February, 23 2018 - 12:27 PM |
On eput simplement utiliser Hversionfichier en comparant le numéro de la version précédente avec celui de la version actuelle et executer le traitement adapté.puis |
| |
| |
| | | |
|
| | |
| |
Registered member 352 messages Popularité : +13 (17 votes) |
|
Posted on February, 23 2018 - 12:47 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 182 messages Popularité : +10 (10 votes) |
|
Posted on February, 23 2018 - 5:22 PM |
j F Piechaud a écrit : > On eput simplement utiliser Hversionfichier en comparant le numéro de la version précédente avec celui de la version actuelle et executer le traitement adapté.puis
Pat 16 a écrit :
Dans le cas d'un serveur HFSQL, oui c'est faisable. Mais relisez bien mon cas : je ne l'utilise pas vu que je suis sur MySQL ... Pis bon, depuis le temps, c'est réglé cette affaire ... |
| |
| |
| | | |
|
| | | | |
| | |
|