QUITTER 4D et événement sur fermeture

Pourquoi mes process sont en état -1 lorsque je passe dans ma méthode base Sur fermeture :?: :evil:

Je ne peux pas passer de message de fermeture à des process déjà killés :?: :!: :roll:

Un process peut savoir qu’il en voie d’extinction grâce à la commande Process interrompu.

Comment on gère correctement la fermeture d’une base ?

La documentation sur http://doc.4d.com/4Dv17/4D/17/QUITTER-4D.301-3730403.fr.htmlQUITTER 4D> et la methode base http://doc.4d.com/4Dv17/4D/17/Methode-base-Sur-fermeture.301-3730028.fr.htmlSur fermeture> semblent contradictoire ou pour le moins confuse.
Sont-elle à jour avec ce qu’il faut réellement faire où suis-je en présence d’un nouveau bug ?

J’essai de passer un message de fermeture à mes process via la méthode Sur fermeture mais le problème c’est que mes process sont déjà avorté ? le passage de message de fermeture ne se fait pas et les process se terminent sans faire le minimum pour annuler et/ou sauvegarder ce qu’il faut.

Demander aux process de se fermer à l’aide d’une communication interprocess depuis la méthode Sur fermeture est un principe que j’ai abandonné. Ça ne donnait pas toujours de bons résultats.

Quand on lui demande de quitter, 4D demande à tous les process de se fermer. Il leur donne un certain temps pour se fermer “normalement” puis, à défaut, les ferme “salement”.

Pour un process qui se trouve dans une boucle (pour un traitement ou une boucle d’attente), il faut ajouter une condition de sortie à la boucle à l’aide de Process interrompu. Avec cette commande, on peut gérer une sortie propre mais ça doit être court.
Pour un process qui est dans un formulaire, on doit pouvoir faire la même chose dans l’événement Sur libération qui doit se produire.

: Stanislas CARON

Quand on lui demande de quitter, 4D demande à tous les process de se
fermer.

C’est bien là l’incoherence !
Il ne peut pas demander aux process de quitter AVANT de passer et d’executer la méthode Sur fermeture !

Et comment tu sais que l’application quitte sur ton événement sur liberation ? il faut au minimum avoir placer un flag.

Bref, pour moi y a un bug.

A la lecture de la doc Process interrompu est là pour gérer le cas d’interruption rapide (ex: on quitte le serveur)
Moi je veux traiter le cas où l’utilisateur quitte l’application sur son poste client. Il a une/des fenêtre(s) process ouverte(s) (en saisie) il demander à quitter il faut annuler cette/ces fenêtre(s).

: Manuel PIQUET

Il ne peut pas demander aux process de quitter AVANT de passer et
d’executer la méthode Sur fermeture !
Si, il peut et il le fait. :slight_smile:

: Manuel PIQUET

Et comment tu sais que l’application quitte sur ton événement sur
liberation ?
Avec Process interrompu.

: Manuel PIQUET

A la lecture de la doc Process interrompu est là pour gérer le cas
d’interruption rapide (ex: on quitte le serveur)
Non, pas seulement. Ça sert dans tous les cas où 4D quitte proprement, pas un plantage quoi. 4D quitte de la même façon que ce soit une demande du serveur, un QUITTER 4D ou l’activation d’un menu “Quitter”.

: Manuel PIQUET

Moi je veux traiter le cas où l’utilisateur quitte l’application sur
son poste client. Il a une/des fenêtre(s) process ouverte(s) (en
saisie) il demander à quitter il faut annuler cette/ces fenêtre(s).
Ce cas rentre dans le cadre que je t’ai donné.

Tu fais comme tu veux mais, de mon expérience, Sur fermeture n’est pas le lieu pour demander aux process de se fermer. De toute façon, 4D s’en est déjà chargé à ce stade.

: Stanislas CARON
: Manuel PIQUET

Il ne peut pas demander aux process de quitter AVANT de passer et
d’executer la méthode Sur fermeture !
Si, il peut et il le fait. :slight_smile:

Cela entre en contradiction avec ce qui est dit dans la doc :!:

: Doc 4D

Quel que soit le moyen par lequel la base a été quittée, 4D accomplit
les actions qui suivent :
S’il n’existe pas de Méthode base Sur fermeture, 4D détruit chaque
process un par un, sans distinction. Si un utilisateur est en train
de saisir des données, les enregistrements ne seront pas sauvegardés.
S’il existe une Méthode base Sur fermeture, 4D démarre l’exécution
de cette méthode dans un process local nouvellement créé. Notez que
4D quittera en tout état de cause — la Méthode base Sur fermeture
peut assurer le nettoyage et la fermeture de toutes les opérations
que vous voulez, mais la fermeture de la base est inéluctable.

: Stanislas CARON

Non, pas seulement. Ça sert dans tous les cas où 4D quitte
proprement, pas un plantage quoi. 4D quitte de la même façon que ce
soit une demande du serveur, un QUITTER 4D ou l’activation d’un menu
“Quitter”.

Sauf que si c’est le serveur qui quitte immédiatement (ou qui a planté) tu ne peux plus executer du code qui sauvegarde un enregistrement …

Je veux pouvoir au moins traiter les cas normaux càd. quand l’utilisateur demande à quitter normalement l’application cliente.

Je reconnais que la doc est confuse.
En réalité, 4D détruit chaque process un par un, sans distinction, dans tous les cas.

Si tu vas plus loin dans cette même doc, tu peux aussi lire :
Pour stopper proprement les process en cours dans le cas où l’application est forcée de quitter, vous devez tester la commande Process interrompu…

: Manuel PIQUET

Sauf que si c’est le serveur qui quitte immédiatement (ou qui a
planté) tu ne peux plus executer du code qui sauvegarde un
enregistrement …
Oui, c’est vrai. Mais que sont les pauvres clients face aux maître serveur. C’est toujours lui qui a le dernier mot :wink:

: Manuel PIQUET

Je veux pouvoir au moins traiter les cas normaux càd. quand
l’utilisateur demande à quitter normalement l’application cliente.
Tu peux le faire. Les opérations doivent juste être très courtes.

Tu peux aussi gérer toi-même le moment où 4D quittera.
Dans ce cas, il ne doit pas y avoir d’action standard “Quitter” dans les menus mais un appel à une méthode qui au bout du compte et quand tu estimeras que c’est le bon moment appellera QUITTER 4D.

: Stanislas CARON

Je reconnais que la doc est confuse.
En réalité, 4D détruit chaque process un par un, sans distinction,
dans tous les cas.
Il le fait mais il doit le faire APRES l’execution de la méthode Sur fermeture s’il en existe une.

: Stanislas CARON

Si tu vas plus loin dans cette même doc, tu peux aussi lire :
Pour stopper proprement les process en cours dans le cas où
l’application est forcée de quitter
, vous devez tester la commande
Process interrompu…
C’est marqué forcée de quitter (les mots ont un sens) c’est pas marqué “l’application est quittée”.

On ne peut pas gérer les 2, c’est soit on utilise la méthode sur fermeture, soit Process interrompu, on ne peut pas cumuler les 2 en même temps.

Le problème c’est que je doute sur ce qui va se passer si 4D tente d’enregistrer un enregistrement alors que le serveur est déjà HS…

: Stanislas CARON

Tu peux aussi gérer toi-même le moment où 4D quittera.
Dans ce cas, il ne doit pas y avoir d’action standard “Quitter” dans
les menus mais un appel à une méthode qui au bout du compte et quand
tu estimeras que c’est le bon moment appellera QUITTER 4D.
A t’écouter la seule réelle solution est de gérer tout AVANT de lancer QUITTER 4D dans tous les autres cas c’est même pas la peine d’essayer de gérer les choses, de toutes façon on est pas garantie du résultat.

Mais cela signifie aussi que toutes les autres stratégies sont possiblement vouées à l’échec et donc ne servent à rien… :roll:

: Manuel PIQUET
: Stanislas CARON

Je reconnais que la doc est confuse.
En réalité, 4D détruit chaque process un par un, sans distinction,
dans tous les cas.
Il le fait mais il doit le faire APRES l’execution de la méthode Sur
fermeture s’il en existe une.
C’est ce que tu aimerais mais ce n’est pas la réalité.
Ça n’a pas d’importance en définitive. Quelle est la différence entre envoyer un message à un process pour lui dire de se fermer et le principe que je t’ai donné ? Ça offre les mêmes possibilités. Tu verras.

: Manuel PIQUET
: Stanislas CARON

Si tu vas plus loin dans cette même doc, tu peux aussi lire :
Pour stopper proprement les process en cours dans le cas où
l’application est forcée de quitter
, vous devez tester la commande
Process interrompu…
C’est marqué forcée de quitter (les mots ont un sens) c’est pas
marqué “l’application est quittée”.
Oui c’est ce qui est écrit mais tu t’imagines bien que si l’application était réellement forcée à quitter, ni 4D ni à fortiori le développeur n’auraient plus la main sur quoi que ce soit. Il faut lire dans le cas où l’application est quittée car autrement ça n’a aucun sens.

: Manuel PIQUET

On ne peut pas gérer les 2, c’est soit on utilise la méthode sur
fermeture, soit Process interrompu, on ne peut pas cumuler les 2 en
même temps.
On peut tout à fait utiliser les deux. Simplement, il ne faut pas se servir de Sur fermeture pour fermer les process. Par contre, on peut y faire d’autres actions.

: Manuel PIQUET

Le problème c’est que je doute sur ce qui va se passer si 4D tente
d’enregistrer un enregistrement alors que le serveur est déjà HS…
Si le serveur est HS, ce n’est même pas la peine d’en parler. De fait, tu ne peux rien faire.

: Manuel PIQUET

A t’écouter la seule réelle solution est de gérer tout AVANT de
lancer QUITTER 4D dans tous les autres cas c’est même pas la peine
d’essayer de gérer les choses, de toutes façon on est pas garantie du
résultat.
Ça dépend de ce que tu veux faire quand l’application quitte.
Il vaut mieux savoir comment les choses fonctionnent et en tenir compte que ne pas savoir ou ne pas en tenir compte.

: Manuel PIQUET

Mais cela signifie aussi que toutes les autres stratégies sont
possiblement vouées à l’échec et donc ne servent à rien… :roll:
Si c’est un quitter côté client, ça fonctionne bien.
Mais si tu veux toucher aux données alors qu’on est dans le cas où c’est le serveur qui a ordonné au client de quitter, alors oui ça semble voué à l’échec.

Ça limite considérablement l’utilité de la méthode base Sur fermeture qui au final ne sert plus à rien…

Dire qu’elle ne sert plus à rien est exagéré. Il faut l’utiliser à bon escient, c’est tout.

Ça se limite à faire fonctionner l’exemple de la doc : écrire un fichier de log pour dire que l’application a quitté: ça me fait une belle jambe… :mrgreen:

Ok, j’ai déplacé mon code de fermeture dans la méthode qui se lance si l’utilisateur choisit de Quitter avant la commande QUITTER 4D, maintenant la question qui fâche:

Sur PC, comment on intercepte le clique sur le bouton de fermeture de la fenêtre MDI ?
J’ai besoin de lancer la methode AVANT que 4D ne quitte l’application :?: :twisted: