PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → Lancer plusieurs ajaxexecuteasynchrone - Jauge
Lancer plusieurs ajaxexecuteasynchrone - Jauge
Débuté par Florian, 29 fév. 2020 14:26 - 7 réponses
Membre enregistré
81 messages
Popularité : +0 (2 votes)
Posté le 29 février 2020 - 14:26
Bonjour,

Pour des questions d'UX, j'essai de mettre a jour une jauge avec le test ci-dessous (j'ai essayé beaucoup de choses)

Mon objectif :
lancer un traitement en ajaxasynchrone. Puis lancer un 2e traitement ajaxasynchrone pour récupérer une valeur coté serveur pour connaitre l'avancement.


Voici mon exemple très simple :

Le bouton "AJAX 1" lance une boucle qui incrémente une valeur nVal. (procédure asynchrone)




Code sous le btn "AJAX 1"





Le bouton "Valeur nVal" lance la récupération de la valeur nVal pour l'afficher a l’écran.





Cependant, quand le 1ere procedure asynchrone est lancée, la 2e ne fonctionne pas.
Pourtant j'utilise bien ajaxSansBloquerContexteAWP.


Si quelqu'un a une idée ou une explication, je suis preneur :)

Cdt
Membre enregistré
16 messages
Posté le 28 mars 2020 - 19:37
Bonjour Florian,
Je suis confronté à un problème similaire pendant un traitement Ajax long.
Je souhaiterais interrompre une boucle démarrée avec AJAXExécuteAsynchrone par le test d'une variable mise à jour par un 2 ème traitement Ajax.
Je suis donc aussi preneur d'une solution.
Merci !

--
>Anysme
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 30 mars 2020 - 12:08
Hello,

A ma connaissance, ce n'est pas possible.
AjaxExecuteAsynchrone va en effet executer une procédure serveur sans bloquer le navigateur.

Cependant, coté serveur, le processus qui gère la session est toujours entrain de traiter la demande.
De ce fait, si on fait une nouvelle demande, elle reste en attente de la fin de la première demande et on se retrouve avec le phénomène que vous décrivez.
Membre enregistré
393 messages
Popularité : +13 (13 votes)
Posté le 30 mars 2020 - 13:08
Bonjour,

François C. a un début de réponse. Par défaut le code serveur est exécuté dans un seul thread, si celui-ci est occupé à réaliser un traitement long lancé par Ajax, alors tous les appels Ajax suivants sont mis en attente.

Cependant, si vous inscrivez votre traitement long dans un thread secondaire (via ThreadExecute par exemple), alors il devient possible d'exécuter d'autres appels Ajax qui vont répondre tout de suite, le thread principal étant alors "libre".

Il suffira alors d'une variable globale à la fenêtre pour suivre la progression : elle sera mise à jour par le thread secondaire, et lue par le thread principal. Il conviendra d'utiliser les Mutex pour éviter de lire la variable pendant qu'elle est mise à jour, ou vice-versa.

Bon dev ;)
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 30 mars 2020 - 15:09
@Benjamin, tu as déjà mis en pratique ta méthode ?

Car en théorie elle doit fonctionner. Mais j'ai déjà essayé car ça semblait être la solution mais même de cette manière je n'avais pas réussi.
Membre enregistré
393 messages
Popularité : +13 (13 votes)
Posté le 30 mars 2020 - 17:28
@François je viens de tenter sur un projet de test en 22 et ça fonctionne correctement.

Après honnêtement je réserverais ça à des traitements "semi-longs", dès qu'on dépasse la minute il y a trop de contraintes :
- A moins de mettre le thread en global avec un traitement déclaré en tant que procédure globale, le thread sera très certainement coupé dans son élan dès qu'on changera de page.
- Si on dépasse le timeout d'Apache ou de WebDev, le premier appel Ajax plantera, donc le navigateur affichera certainement une erreur, mais le thread risque de toujours tourner en fond
- L'utilisateur peut encore fermer le navigateur sans faire attention et la procédure en cours va être coupée par la valeur de durée maximale d'inactivité d'une session.
- etc...

Bref amha c'est à réserver aux traitements suffisamment rapides pour que la progression soit visible par l'utilisateur sans l'impatienter : si le traitement met 1 minute à avancer de 1%, pas sûr qu'il reste très longtemps à supporter ça...

Perso pour les traitements > 5s mais < 1min, j'affiche simplement une popup avec jauge infinie, avec un message "veuillez patienter" sans forcément annoncer l'avancement. Le code est alors un simple code serveur, on fait un popupaffiche en navigateur juste avant pour afficher la popup, et elle se fermera toute seule quand la page sera réaffichée.

Pour mes traitements plus longs, ils ne sont pas exécutés par la session de l'utilisateur : celle-ci enregistre les paramètres en bdd dans une file d'attente, et une tâche planifiée se charge d'exécuter ces traitements en arrière-plan, vidant petit à petit la file d'attente.
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 30 mars 2020 - 17:52
Ok je vais ressayer.. curieux !
Membre enregistré
16 messages
Posté le 31 mars 2020 - 09:43
Bonjour,
Merci pour vos conseils, je comprends mieux le fonctionnement d'Ajax et le lancement d'un thread secondaire a bien résolu mes problèmes.
Cordialement,

--
>Anysme