PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → l’arrêt d'un thread après la fermeture d'un navigateur (croix de navigateur) dans une application webdev23
l’arrêt d'un thread après la fermeture d'un navigateur (croix de navigateur) dans une application webdev23
Débuté par Naimo2, 03 avr. 2018 18:26 - 11 réponses
Membre enregistré
10 messages
Posté le 03 avril 2018 - 18:26
Bonsoir, dans une application web
j'ai crée un thread qui se répète tous le 2 minutes et c dernier s’arrête si l'utilisateur clique sur le bouton cancel ou le bouton save .

le problème est quand l'utilisateur ferme le navigateur et appui sur le croix de navigateur, le thread continue à s'exécuter en arrière plan .

le thread a comme but de bloquer tous les autres utilisateurs de modifier un "Quote" s'il ya un utilisateur qui est entrain de le modifier.

Ce thread met à jour l'heure et la date de la table "quote_ouvert" tout le 2 minute, et quand l'utilisateur sort de c quote, le ligne sera supprimé de la table "quote_ouvert" et le thread s’arrête .

on utilise c thread pour vérifier si le quote est ouvert depuis plus que 2 minute
(quand un erreur c'est produit et le quote reste enregistrer dans la table "quote_ouvert")
si c'est le cas on supprime le ligne de la table "quote_ouvert" et l'urilisiteur peut se connecter sur c quote.

un autre ligne sera ajouté avec les information de nouveau utilisateur.

pour arrêter le thread j'utilise : threadarrète("nomthread",threadnormal,procédure_à_exécuter)

Comment forcer l’arrêt du thread quand l'utilisateur ferme son navigateur

Merci d'avance.
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 04 avril 2018 - 11:28
Bonjour,

Un timer navigateur faisant un appel asynchrone à une procédure serveur devrait régler le problème ?
Ainsi, une fois le navigateur fermé, le timer s’arrête et ne fait plus de demandes au serveur.
Membre enregistré
10 messages
Posté le 04 avril 2018 - 18:04
Bonjour,
on peut pas faire un timer faisant appel à une procédure serveur il faut que La procédure appelé par le timer soit une procédure navigateur locale de la page.
j'ai pas arrivé à résoudre le problème !
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 04 avril 2018 - 18:19
Voir par ici :
https://doc.pcsoft.fr/?3055115

Je n'ai pas essayé .. mais je ne vois pas pourquoi on ne pourrait pas le faire dans un timer navigateur ?
Posté le 06 avril 2018 - 09:31
Salut.
François a raison. Appel à une procédure du type de celles qui permettent de maintenir une session "indéfiniment" ouverte.
Tu ne pourras jamais exécuter une action sur le serveur, et ici c'est ton cas (non ?), par le biais du navigateur sinon en passer par une procédure Ajax.

Exemple pour maintenir une session (mais pas que...) sur un site dynamique, Procédure appelée dans le code navigateur de la page :
//en centième de seconde
Timer(TICTAC_SESSION,5000)//session

La procédure globale Ajax "TICTAC()" :
PROCÉDURE TICTAC()
SI ContexteExiste(Ma_Page) ALORS
Ma_Page.ContexteLocal()
FIN

La Procédure Locale Serveur "Contexte local()" (qui est éventuellement dans chaque page) :
PROCÉDURE ContexteLocal()
//client connecté oui/non
SI Mon_critère = "" ALORS
Traitement....
fin

Cette procédure permet de maintenir une activité sur le serveur
tu peux définir un automatisme à la procédure
tu peux définir un délai très bref à la fermeture du navigateur, peu importe comment il a été fermé


Enfin, si j'ai compris ce que tu veux faire...
Membre enregistré
10 messages
Posté le 06 avril 2018 - 13:46
Merci beaucoup pour votre aide,
oui j'ai déjà essayé d'appeler un procédure serveur à travers Ajax mais l'appel de procédure ce fait q'une seul fois avec l'utilisation de Timer
Mon code:
Procedure opened_quote_refresh2()
AJAXExecute(ajaxAppelSimple,OPENED_QUOTE_REFRESH,id_de_quote,login_de_quote)
Timer("opened_quote_refresh2",120s)

le procédure opened_quote_refresh2 est un procédure_local navigateur qui fait l'appel à un procédure serveur OPENED_QUOTE_REFRESH
donc le timer ne fonctionne pas correctement dans ce cas !
avez vous des idée !
merci
Message modifié, 06 avril 2018 - 13:51
Posté le 06 avril 2018 - 14:36
Salut

Pourquoi redéfinir un timer ? la procédure peut elle même être paramétrée.

Autre chose, il faut penser à l'envers, c'est à dire que la procédure est destructrice, si l'utilisateur n'est plus connecté, alors son entrée est effacée (et non pas effacer si...), il suffit que la procédure fasse appel à l'id de l'entrée... le tout via Ajax.

je ne vois pas où est la difficulté ?
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 06 avril 2018 - 14:47
Et utiliser AJAXExécuteAsynchrone plutot que AjaxExecute pour eviter le blocage de la page.

Le timer tu le défini au chargement de la page. C'est le timer qui appellera la procédure toutes les X secondes.

@Joseph Concernant la méthode.. peut importe. Il peut très bien renseigner un champ LAST_USER_DATE toutes les 60 secondes par exemple avec la datesysteme.
Lorsqu'un prochain utilisateur ira sur ce devis, si LAST_USER_DATE > 1 minute c'est que plus personne n'est dessus.
Membre enregistré
10 messages
Posté le 06 avril 2018 - 16:25
#Joseph j'ai déjà utilisé un procédure paramétrée mais le problème est que je n'arrive pas à l’arrêter c pour ça j'ai essayé d'utiliser le timer

#françois oui je le défini au chargement de la page mais le procédure ne s'exécute qu'une seul fois.

je vais essayé les autres idées
Merci : )
Posté le 06 avril 2018 - 20:11
Autant je suis un fan de tout coder, mais là, pourquoi compliquer la chose ?
Procédures automatiques : https://doc.pcsoft.fr/?9000072
Et sincèrement, je ne vois pas ce qui ne fonctionne pas ?
Par curiosité, que cherche tu as bloquer ? un enregistrement ? Le plus simple est encore de passer par une requête SQL de modification qui bloque ledit enregistrement ! cela n’empêche pas la lecture mais interdit à un autre utilisateur de modifier l'enregistrement bloqué. Lors de la création de la requête, il suffit de vérifier si bloqué, si oui = traitement (message...) si non = affiche l'enregistrement désiré. Si l'utilisateur sort comme un sagouin l'enregistrement est libéré.
Il est même possible (et souhaitable) d'expédier un message à celui qui bloque (il s'est endormi dessus...) en lui demandant de libérer le record, ce message apparaît par exmple sur la page.
Nan mais...
Posté le 07 avril 2018 - 15:09
Bonjour

Pas besoin de timer pour ce type de traitement.
La procédure qui place le lock applicatif lié au record commence par supprimer les locks trop anciens.
C'est plus écologique on n'appelle le code de nettoyage que si c'est utile !
Membre enregistré
10 messages
Posté le 08 mai 2018 - 10:20
Bonjour, Merci pour vos message,
en fin j'ai arrivé à le faire à travers le timer, c'est exactement comme il a dit François C.
Merci beaucoup : )