PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → Page ne répond pas (traitement long)
Page ne répond pas (traitement long)
Débuté par Monsieur KURKA, 10 mai 2019 16:42 - 16 réponses
Membre enregistré
28 messages
Posté le 10 mai 2019 - 16:42
Bonjour,

J'exécute avec la méthode suivante un traitement +/- long sur une page :
AJAXExécuteAsynchrone(ajaxActualiseChamps,PL_Controle_Differences, FinTraitementLong)

Au bout d'un certains temps, le navigateur me dit que la page ne répond pas.

Même si je lui dis d'attendre, j'ai l'impression que cela bloque mon traitement car en faisant le test en mode debug, ca fonctionne.

Avez-vous une idée pour éviter ce message du navigateur svp ?
Message modifié, 10 mai 2019 - 16:43
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 10 mai 2019 - 17:12
A verifier mais, si AJAXExécuteAsynchrone ne bloque pas la navigation, il est par contre tout a fait possible que la session serveur soit elle bloquée par le traitement serveur en cours, lancé par AJAXExécuteAsynchrone()

Du coup, si pendant que ta fonction PL_Controle_Differences s'execute, coté navigateur tu fait une nouvelle demande AJAX il se peut que du coup, tu doive attendre la fin de PL_Controle_Differences pour que s'execute ton nouveau traitement..

A tester, ce n'est qu'une idée (que j'avais déja lu quelque part ..)
Membre enregistré
28 messages
Posté le 13 mai 2019 - 08:42
Merci pour ta réponse.

En fait, je ne fais pas 2 appels à la méthode AJAXExécuteAsynchrone. J'en fais seulement un sur un bouton (cf. le code de mon post initial).

Et c'est pendant ma procédure PL_Controle_Differences, qui fait un TableCherche sur 30 000 lignes certaines fois, que le message navigateur s'affiche puisqu'il détecte quelque chose d'anormal.

Au pire, je voulais améliorer le traitement du TableCherche car c'est vraiment lui qui prend beaucoup de temps, mais je ne vois pas d'autres solutions...
Vu qu'il n'est pas possible de chercher en fonction de plusieurs colonnes, j'ai créé une colonne avec tous mes champs souhaités pour la recherche séparé par des ";" et je cherche là-dessus.
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 13 mai 2019 - 12:14
Hello,

Il faut bien comprendre que ton tableau, même si tu ne fais deux fois l'appel AJAXExécuteAsynchrone(), lui fonctionne aussi en ajax (je suppose) donc tu fais bien 2 appels ajax.
Mon explication du haut reste du coup valable (jusqu'a preuve du contraire ..biensur :p)
Posté le 29 juillet 2019 - 15:49
Bonjour francois ,

Je pense que c'est un probleme avec windev.
Pareil pour moi, a chaque que j'ai un long traitement derriere un bouton windev me dit que la fenetre ne repond pas.
Si tu as une reponse a cela, veuiller le partager svp
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 29 juillet 2019 - 16:55
@Cheikhou

Attention, ici on parle de WEBDEV et non de WINDEV.
Ce n'est pas le même problème.

Pour ton cas, si tu fais un traitement long et que tu ne souhaite pas bloquer l'interface, il faut utiliser les threads
Posté le 26 novembre 2020 - 15:12
Bonjour,

Je reviens sur ce sujet, j'ai suivi l'exemple : https://doc.pcsoft.fr/?1000019562&name=jaugeactive_fonction

Je suis sur Webdev 22.

Cet exemple permet d'afficher une jauge en fonction de l'avancé d'un traitement serveur, mais problème mon traitement serveur est très long, il s'agit d'une procédure globale (boucle "POUR" sur une variable tableau d'environ 5000 lignes avec Hexecuterequetesql à chaque itération et traitement du résultat de la requête) et donc je mets bien à jour la valeur de la jauge à chaque itération de cette boucle avec la fonction multitâche comme indiqué dans l'exemple.

Mais lors du traitement en mode test, le debug fonctionne bien, le traitement passe par toutes les fonctions , la valeur de la jauge change bien mais sur mon navigateur (IE 11) le message apparaît "localhost ne répond pas..". Donc la jauge n'avance pas alors que le traitement oui et au bout de 90 secondes, un timeout apparaît "ERR_TIMEOUT_REQUEST".

J'ai bien vérifié si AJAX était disponible sur IE et oui c'est dispo.

J'ai essayé d'optimiser ma boucle, j'ai suivi ce que la doc recommande avec hpreparerequetesql() et hlitpremier avec option hsansrafraichir mais le temps de traitement ne me semble pas diminuer.

J'aimerais votre aide là dessus, ça fait quelques jours que je suis là dessus...

Voici le code :

//Code navigateur sortie avec modification d'un champ interrupteur
//affichage chargement
CelluleAfficheDialogue(CELL_Traitement,celCentre,Vrai,20)
ExécuteTraitement(BTN_Traitement_jauge,trtClic)


//Code navigateur clic BTN_Traitement_jauge
JaugeActive(JAUGE_avance_traitement,1*100,Vrai)
//procédure exécutée avec AJAXExecuteAsynchrone(), la procédure navigateur "Fermeture_chargement" contient juste Cellulefermedialogue(CELL_Traitement)
AJAXExécuteAsynchrone(ajaxActualiseChamps,Verif_Comptage_RGPD,Fermeture_chargement,"OPPOSES_SMS")


//Code procédure globale serveur autorisé en AJAX
HPrépareRequêteSQL(sdRes_requete2,Connexion_SLQ_Server,hRequêteSansCorrection,"SELECT OPPOSES_SMS, Prospec_Com FROM PA_LOC_PRINC WHERE NO_PORTABLE= @num")

SI TableauOccurrence(gtabTableauFichierExcel) > 0 ALORS
POUR i=1 _A_ TableauOccurrence(gtabTableauFichierExcel) PAS 1
PAGE_Principale.CELL_Traitement.JAUGE_avance_traitement = i / TableauOccurrence(gtabTableauFichierExcel) * 100
sdRes_requete2.num = gtabTableauFichierExcel[i]
HExécuteRequêteSQL(sdRes_requete2)
HLitPremier(sdRes_requete2,hSansRafraîchir)
TANTQUE HTrouve()
SI sdRes_requete2.OPPOSES_SMS = "T" ALORS
nB_num_opposes_sms++
SORTIR
FIN
HLitSuivant()
FIN
Multitâche(1*100)
FIN
FIN
Posté le 26 novembre 2020 - 15:15
J'ai essayé les threads mais je n'ai pas vraiment compris leur utilisation, et les fonctions de thread sont exécutables qu'en code serveur...
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 30 novembre 2020 - 09:42
Hello,

Pour la mise a jour de la jauge je ne sais pas... je ne me suis jamais servi de cette fonction, par contre pour ton timeout :
Si ton traitement est vraiment LONG il te faut une autre solution, tu seras toujours soumis au timeout défini dans les paramètres du serveur d'application webdev.

La seule solution serait de découper ton traitement en plusieurs fois et de faire une boucle en code navigateur qui viendrait traiter par paquet de 50 par exemple ...

Sinon, dans ton code tu a repris " Multitâche(1*100) " qui fait une pause de 1 seconde a chaque itération .. met -1 ca ira plus vite déjà :)
Membre enregistré
8 messages
Posté le 01 décembre 2020 - 09:12
Bonjour,

Merci de votre réponse et de votre aide.

J'ai mis Multitâche(-1) mais ça ne fonctionne toujours pas, Windows ne reprend jamais la main sur le navigateur... et le message "localhost ne répond pas" apparaît..

Et pour découper mon traitement je ne vois pas trop comment faire... il n'y a vraiment pas d'autre solution ?
Je trouve ça bizarre que PC SOFT n'est pas réfléchi à ce problème de traitement long et de simplifier sa résolution pour faire attendre l'utilisateur sur la page web.

Cordialement,
Posté le 01 décembre 2020 - 18:28
Bonjour,

Merci de votre réponse et de votre aide.

J'ai mis Multitâche(-1) mais ça ne fonctionne toujours pas, Windows ne
reprend jamais la main sur le navigateur... et le message "localhost ne
répond pas" apparaît..

Et pour découper mon traitement je ne vois pas trop comment faire... il n'y a
vraiment pas d'autre solution ? Je trouve ça bizarre que PC SOFT n'est pas
réfléchi à ce problème de traitement long et de simplifier sa résolution pour
faire attendre l'utilisateur sur la page web.

Cordialement,


ah !! vieux serpent de mer
on pensait que les taches différées conviendraient ? mais non ! cela
suit le mêmes règles de time out que le projet web.
On voudrait pouvoir gerer contextuellement le time out ? Non !! maintes
fois suggéré, jamais obtenu.

j'ai eu ce genre de problème sur des gros pb de batch. Voilà comment
j'ai fini par procéder.
Depuis l'interface web, l'utilisateur déclenche son ordre d'action et
cela écrit tout ce qu'il faut dans une table.

Toutes les xx minutes, un robot fait avec un projet webdev de tâches
planifiées (projet dédié à cela important ! ne pas mélanger) il va voir
dans la table s'il a des tâches en attente, les traite et renomme
ensuite les tâches.
On a alors le compte rendu de ces taches dans cette table action, avec
des moyens de contrôler les différents jobs.

Assez penible à mettre au point (debuggage, suivi) mais cela
focntionne.
En général je produis, teste et met au point le code en Windev.
Puis je la passe en procedure planifiées dans webdev

--
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Membre enregistré
8 messages
Posté le 02 décembre 2020 - 16:33
Merci de votre réponse.

Mais cette solution m'a l'air bien complexe et compliqué à mettre en place...

J'ai essayé d'avancé sur le problème , j'ai mis le code d'avancement de ma jauge sur le chargement de ma page en code navigateur sans qu'il y est de traitement serveur long et tout fonctionne bien, ma jauge se remplie.

Mais lorsque le traitement serveur met plus longtemps genre 2-3 minutes, ma page plante, localhost ne répond pas, le débuggeur passe bien par les états d'avancement de ma jauge mais ma jauge sur le navigateur ne se met pas à jour... la fonction multitâche ne fonctionne pas, elle rend pas la main à WIndows et au navigateur...

Je vous en supplie, ça fait presque 1 semaine que je suis là dessus...

Merci d'avance.
Membre enregistré
8 messages
Posté le 02 décembre 2020 - 16:39
Petite info supplémentaire, j'ai mis ce code là au début de ma procédure globale serveur :

Procedure traitement()
PAGE_Principale.CELL_Traitement.JAUGE_avance_traitement = 0
POUR i = 1 A 10
Multitâche(-50)
PAGE_Principale.CELL_Traitement.JAUGE_avance_traitement += 10
FIN

//Traitement long plusieurs boucle POUR imbriquée
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 02 décembre 2020 - 16:46
Hello,

On ne peut pas te dire mieux que ce qu'on a deja dis : Si ton traitement dépasse le timeout que TU as décidé dans les paramètres du site, tu auras ce phénomène.

Le solutions on te les a déjà proposé :
- Faire des boucles en navigateur avec des AjaxExecuteAsynchrone() et traiter les données par lots pour que chaque lot prenne moins de temps que le time out
- Faire un système de Taches a réaliser qu'un robot tiers vient collecter, traiter et rendre compte.

Apres peut etre tu peux t'interesser a ta methode, il y a peut etre moyen de faire plus simple et plus rapide ?
Membre enregistré
8 messages
Posté le 03 décembre 2020 - 09:45
D'accord,

Merci du temps consacré à mon problème, je pense que je vais essayer de découper mon fichier excel en plusieurs parties pour que le traitement traite par paquet.

Bonne journée.
Membre enregistré
386 messages
Popularité : +13 (13 votes)
Posté le 07 décembre 2020 - 10:01
Bonjour,

Comme le dit François C. il faudrait avant tout essayer d'optimiser le traitement, le bout de code que vous avez fourni n'est vraiment pas idéal. Votre code semble être là juste pour compter combien de numéros parmi la feuille excel se trouve dans votre base de données avec une valeur particulière dans la colonne "OPPOSES_SMS". Par conséquent il devrait être bien plus rapide de tout regrouper avec un IN() et faire un COUNT()

sRequête est une chaîne = "SELECT COUNT(*) AS nb_opposes FROM PA_LOC_PRINC WHERE NO_PORTABLE IN(%1) AND OPPOSES_SMS = 'T'"
sRequête = ChaîneConstruit(sRequête, TableauVersChaîne(gtabTableauFichierExcel,",") // Peut suffire, sous réserve que gtabTableauFichierExcel soit déjà un tableau "échappé" avec des apostrophes s'il s'agit de chaines.

SI HExécuteRequêteSQL(sdRes_requete2, Connexion_SLQ_Server, hRequêteSansCorrection, sRequête) _ET_ HLitPremier(sdRes_requete2) ALORS
nB_num_opposes_sms = sdRes_requete2.nb_opposes
FIN


Même s'il y a 5000 occurrences dans votre tableau, vous ne faites ainsi qu'un seul aller/retour vers le SGBD, ce qui devrait réduire drastiquement le temps de traitements, et en prime vous laissez l'optimisation réelle dans les mains du Query Planner de SQL Server. Il faudra ensuite vérifier si les index sont bien là sur la table SQL Server pour faciliter la recherche dans la table, etc.

En bref, il y a déjà plein de choses à optimiser dans votre code, vous l'avez dit vous-mêmes, mettre en place un système de découpage ou de tâches en arrière-plan est déjà plus compliqué et, à mon avis, devrait être réservé en ultime recours, quand toutes les autres optimisations auront été effectuées. ;)

Bonne journée,
Membre enregistré
8 messages
Posté le 15 décembre 2020 - 17:33
Bonjour,

Merci pour cette réponse, elle fonctionne parfaitement, j'ai rajouté les apostrophes à chacune de mes chaines dans mon tableau et la requête s'exécute automatiquement. Il n'y a presque plus de temps d'attente donc plus besoin d'afficher de fenêtre de chargement.

Encore une fois, merci pour le temps pris à résoudre mon problème.

Cordialement,