PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → thread et Mettre à jour une table
thread et Mettre à jour une table
Iniciado por JPB, 25,sep. 2019 17:31 - 9 respuestas
Miembro registrado
118 mensajes
Publicado el 25,septiembre 2019 - 17:31
Bonjour à tous,
j'essaie de mettre en place un système de mise à jour en arrière plan de table.
j'ai besoin de conseil concernant les threads:
voici comment je compte opérer.
- j'initalise ma fenêtre et lance un thread qui va récupérer les données et les mets en forme dans un tableau.
- Ce thread est répété toutes les 30 secondes et réécrit tout le tableau à chaque fois.

- à la fin du thread, j'ai mis un demandemiseàjourIHM qui lance une procédure de rafraichissement de la table affichée.
Cette procédure reprend le tableau écrit dans le thread et l'affiche en conservant les filtres, les tris et la sélection de la table.
les lignes absentes sont ajoutées, les lignes présentes modifiées et les lignes supprimées... sont supprimées :)

Jusqu'ici tout va bien.
oui mais voilà, l'utilisateur, ce fourbe, veut aussi pouvoir créer et modifier des lignes. Et il n'a pas envie d'attendre 30 secondes que le tableau se rafraîchisse.

Du coup ma question est simple:
comment faire ? (quelle est la bonne pratique ?)
- je peux accroître la fréquence de rafraîchissement du tableau de données (mais la bdd va faire la gueule) et l'utilisateur, à part s'il doit attendre moins d'1 seconde, ça ne va pas lui convenir.

- est-ce que je relance le thread (mais j'imagine qu'il faut attendre qu'une éventuelle occurence du thread se termine... et ça j'ai du mal)

- est-ce que je modifie le tableau en mémoire et demande un rafraichissement de l'IHM : mais là j'ai peur des accès concurrentiels: si le thread écrit dans le tableau au moment où je veux le modifier ou ajouter une ligne... il se passe quoi ?)

- est-ce que je modifie directement la table affichée en ajoutant/modifiant/supprimant une ligne ? (là y'a pas de contre indication sauf que bon faut que je refasse pas mal de code).

D'avance merci de vos conseils avisés !
Publicado el 25,septiembre 2019 - 18:09
ça serai pas mal si tu nous montre ce que t'as fait comme code, et on discutera après
Miembro registrado
160 mensajes
Publicado el 25,septiembre 2019 - 21:22
pourquoi tu veux utiliser les threads ?

tu peux mettre juste un boutton pour MAJ le tableau à la demande d'utilisateur
Publicado el 01,octubre 2019 - 15:06
Le 25/09/2019 à 19:22, yasser p a écrit :
pourquoi tu veux utiliser les threads ?
tu peux mettre juste un boutton pour MAJ le  tableau à la demande
d'utilisateur


Solution que j’emploie :

- rajout d'un horodatage dans mes fichiers
- Rafraichissement partiel de mon tableau mémoire (pas table) avec un
thread "régulier" (tempo dépends du besoin) en se basant sur
l'horodatage (mis à jour par création/modification)
- rafraichissement à la demande (si le thread n'est pas en cours de
rafraichissement)
- un flag "global" en section critique qui permet de n'avoir qu'un
rafraichissement en cours à l'instant T.
- Sur tempo ou sur clic je bascule le tableau mémoire vers la table pour
visu client.

Seul hic du rafraichissement partiel c'est en cas de suppression. On a
créé un flag "a supprimer" dans nos fichiers pour cela, ils sont purgés
une fois par jour et on impose une mise à jour complète du tableau
mémoire par jour juste après.

J'ai une appli qui tourne H24 7/7 sur ce principe (monitoring visuel
avec maj auto toute les 5 minutes + envois d'alerte mail en tempo 5
secondes)

J'ai donc :
- 1 thread de lecture des data
- 1 thread pour l'affichage dans la tableau
- 1 thread pour l'envoi des alertes

- 1 bouton "refresh" qui permet le rafraichissement par l'utilisateur

- une variable globale <section critique> pour le status "en cours de
lecture"
- une variable globale <section critique> pour le status "en cours
d'affichage"

Pour la manipulation des champs / mails / Ihm en général, utiliser
executeThreadPrincipal.

Fred.
Miembro registrado
117 mensajes
Publicado el 02,octubre 2019 - 11:30
J'imagine que ton thread fait appel à une procédure et que ton thread est configuré pour faire appel à ladite procédure toute les 30 secondes.

Du coup, si ma supposition est correcte, pourquoi ne pas tout simplement faire appel à la procédure de mise à jour de la table après que l'utilisateur ait ajouté une (des) ligne(s) et par extension, ré-initialiser le temps d'appel du thread à 30 secondes après l'appel de la procédure ?

Autre chose, pourquoi vider complètement la table à chaque rafraichissement ? pourquoi ne pas simplement ajouter des conditions genre "si htrouve() = faux alors [traitement] sinon [traitement]". Ca te permettra moins de traitement, donc plus de ressources, donc plus de satisfaction ^^

Bien à vous
Miembro registrado
118 mensajes
Publicado el 03,octubre 2019 - 16:18
bon d'abord merci beaucoup pour vos contributions.
alexion comment tu réinitialises le temps d'un thread ?
Miembro registrado
117 mensajes
Publicado el 03,octubre 2019 - 17:13
je ne l'ai jamais testé donc je doute de la véracité de mes dires (après tout, cela ne fait qu'un gros mois que j'ai commencé Windev ^^)

mais sur le code de ta procédure (dans son ruban pour être plus précis), tu peux définir les automatismes de la procédure
Donc tu définis que ta procédure est un thread, qui s'effectue de manière infinie avec un espacement de 30 secondes entre les appels et tu fais appel à la procédure au moment de l'appel

Ainsi, si je schématise grossièrement, tu lances ton projet, au démarrage du projet, tu fais appel à la procédure qui va boucler toutes les 30 secondes et théoriquement, si à un moment donné, tu refais appel à ta procédure, ben ça devrait ré-initialiser son timer d'appel

edit :
voir ci-joint le screenshoot de l'automatisation de la procédure



Mensaje modificado, 03,octubre 2019 - 17:14
Miembro registrado
117 mensajes
Publicado el 03,octubre 2019 - 17:17
après, faudrait que tu fasse le test et revienne vers nous pour confirmer ou infirmer mes propos ^^

A moins que quelqu'un puisse confirmer ou infirmer mes propos avant que tu ne t'essaies à cette théorie
Miembro registrado
118 mensajes
Publicado el 03,octubre 2019 - 17:29
faut que je teste mais je ne crois pas.
moi j'utilise un booléen qui neutralise le code du thread quand je ne veux pas qu'il s'exécute (le code est mis dans une boucle avec un booléen global qui peut être mis à faux ou vrai suivant si on veut que le code s'exécute.)
Miembro registrado
72 mensajes
Publicado el 08,octubre 2019 - 18:53
si tu es en HFSQL client/serveur, utilise Hsurveille plutôt qu'un timer au x temps

plutôt qu'utilisé les thread, utilise les tâches parralèles, il y un webinaire sur youtube de pcsoft. Je trouve que c'est plus facile à utilisé

Et entoure ton code avec des sections critique ou du moins protège ton tableau avec l'attribut <section critique> ce qui empêchera les accès concurrentielle à ton tableau.