PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → Utilisateur voulant interompre un traitement
Utilisateur voulant interompre un traitement
Started by Sauveur CONSALVI, Jan., 19 2026 5:59 PM - 1 reply
Registered member
402 messages
Posted on January, 19 2026 - 5:59 PM
Bonjour,
Dans une projet j'ai un bouton qui lance un Tread assez long avant d'ouvrir une fenêtre
Comment faire pour que l'utilisateur puisse annuler sa demande ?
Cordialement

--
Cordialement
SC
Registered member
402 messages
Posted on February, 04 2026 - 12:07 PM
Bonjour
Bonjour à tous
Je me suis acharné, et j'ai finit de trouver une solution
Grace à vos conseils et surtout à ChatGPT ..

Un utilisateur veut visualiser plusieurs informations Pour cela, il clique sur un bouton qui lance une longue procédure avant d'ouvrir la fenêtre qui présente ces informations
Le problème : permettre à l'utilisateur d'annuler sa demande pendant cette longue procédure
La solution : avoir un bouton "Stop" qui passe une variable booléen à vrai, et dans la longue procédure tester régulièrement cette variable et si elle est "vrai" arrêter la procédure
La logique est simple, mais le code à utiliser pour cela n'a pas été facile pour moi de le trouver ..

La variable :
gbArretDemande est un booléen = Faux

Le bouton "Stop" (Il est invisible par construction, passé à visible lors du lancement de la procédure) :
gbArretDemande = Vrai

Le bouton qui demande la visualisation lance procédure :
gbArretDemande = Faux
BoutonArret_Affiche() // rend le bouton visible
Sablier(Faux)
ThreadExecute("Mon_THREAD", threadNormal, ProcedureLongue)

Dans la "ProcedureLongue", on test régulièrement si "gbArretDemande" est à Vrai, dans ce cas on arrête la demande de visualisation :
Procedure ProcedureLongue()
gsMessageErreur = "" // On initialise le message d'erreur
// On informe régulièrement l'utilisateur Comme on ne peut utiliser ToastAffiche dans le Thread, on lance une procédure
gsMessage1 = ""
gsMessage1 = "Création de la liste du contenu de la sauvegarde"
ExécuteThreadPrincipal(ToastAffiche)
//
// Code de la procédure
//
ThreadPause(200) // permet au thread principal de traiter les clics
SI gbArretDemande = Vrai ALORS
// Masquer le bouton
ExécuteThreadPrincipal(BoutonArret_Cache)
// Fin propre du thread
ExécuteThreadPrincipal(ProcedureLongue_FinThread, Faux)
RETOUR
FIN
// Si une erreur est trouvée dans la précédure , logique ou système On ne peut utiliser la fonction "Erreur"
// On remplit la varaible gsMessageErreur qui sera affichée à la fermeture du Thread
SI gbOK = Faux ALORS
gsMessageErreur = "Erreur dans la procédure"+RC+ErreurInfo(errComplet)
gbOK=Faux
ExécuteThreadPrincipal(ProcedureLongue_FinThread, Faux)
RETOUR
FIN
// Code de la procédure
//
ThreadPause(200) // permet au thread principal de traiter les clics
SI gbArretDemande = Vrai ALORS
// Masquer le bouton
ExécuteThreadPrincipal(BoutonArret_Cache)
// Fin propre du thread
ExécuteThreadPrincipal(ProcedureLongue_FinThread, Faux)
RETOUR
FIN
// Code de la procédure
//
// Fin de la procédure
ExécuteThreadPrincipal(ProcedureLongue_FinThread, Vrai)
RETOUR

"BoutonArret_Cache" masque le bouton "Stop" qui demande l'arrêt :
BTN_Arret.Visible = Faux
RENVOYER Vrai

La "ProcedureLongue_FinThread" qui demande l'arrêt de la procédure longue Elle reçoit en paramètre Faux si l'arrêt est demandé par l'utilisateur, sinon Vrai en fin de la procédure longue :
Procedure ProcedureLongue_FinThread(bSuccès est un booléen)
FEN_Gestion.BTN_Arret.Visible = Faux // On cache le bouton Stop
gbArretDemande = Faux // On remet la variable de demande arrêt à Faux
SI gsMessageErreur <> "" ALORS Erreur(gsMessageErreur) // Si l'arrêt à été demandé suite à une erreur, on affiche l'erreur

SI bSuccès = Vrai ALORS // L'arrêt n'a pas été demandé par l'utilisateur ou suite à une erreur
////// info("Fin du Thread")
ThreadDemandeArrêt("Mon_THREAD")
ThreadAttend("Mon_THREAD", 300)
Ouvre(FEN_Visualisation_Information)
SINON // Arrêt par utilisateur ou suite à une erreur
gsFicSauveRes = ""
Avertissement("Vous avez annulé votre demande")
FIN

La procédure qui exécute le ToastAffiche :
Procedure ToastAffiche()
ToastAffiche(gPoliceGras() + gPolice("Batang") + gPoliceTaille(12) + gStylo(Blanc) + gsMessage1,toastLong, cvMilieu, chDroite, BleuFoncé)


Voila, j'espère que cela pourra aider ceux qui ont ce même besoin
Bien sur, on peut certainement améliorer tous ces codes .......
Cordialement
SC

--
Cordialement
SC