IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Utilisateur voulant interrompre un traitement


Sujet :

WinDev

  1. #21
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 060
    Par défaut
    Il est plus rapide de lire un fichier de 10 Mo en une seule fois que de ce fichier en 10 000 fois.
    Attention tout de même car un fichier contenant des millions de lignes sera coûteux en temps de chargement et en mémoire utilise puisque tout monte dans la RAM.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  2. #22
    Membre éclairé
    Homme Profil pro
    Informaticien en retraite ...
    Inscrit en
    Janvier 2008
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Informaticien en retraite ...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 511
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gbArretDemande 	est un booléen = Faux
    Le bouton "Stop" (Il est invisible par construction, passé à visible lors du lancement de la procédure) : Le bouton qui demande la visualisation lance procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	gbArretDemande 	= Faux
    	BoutonArret_Affiche()  // rend le bouton visible
    	Sablier(Faux)
    	ThreadExécute("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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    PROCÉDURE 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCÉDURE 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCÉDURE 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

  3. #23
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 234
    Par défaut
    Ton code est une catastrophe pour répondre à ta problématique !

    Je n’ai pas mon Windev sous la main, donc j’ai donc fait appel à Gemini, pour te montre une meilleure approche.

    Cest cette approche que j’utilise aussi bien sous Delphi que sous Windev.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // --- Dans l'initialisation de la fenêtre ---
    CONSTANT WM_UPDATE_STATUS = WM_USER + 101
    CONSTANT WM_FIN_THREAD    = WM_USER + 102
     
     
    // On branche les messages sur des procédures locales
    Événement(ReceptionStatus, "*.*", WM_UPDATE_STATUS)
    Événement(ReceptionFin, "*.*", WM_FIN_THREAD)
     
     
    // --- Procédures de réception ---
    PROCÉDURE ReceptionStatus(nMessage, nWParam, nLParam)
    // nWParam contient ici l'adresse d'une chaîne (voir plus bas)
    sLibelle est une chaîne = Transfert(&nWParam) 
    LIB_Etat = sLibelle // Mise à jour d'un libellé ou Toast
     
     
    PROCÉDURE ReceptionFin(nMessage, nWParam, nLParam)
    bSucces est un booléen = nWParam
    BoutonArret..Visible = Faux
    SI bSucces ALORS
        ToastAffiche("Sauvegarde terminée avec succès")
    SINON
        Erreur("La sauvegarde a échoué ou a été annulée")
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Code du bouton "Lancer Sauvegarde"
    gbArretDemande = Faux
    BoutonArret..Visible = Vrai
     
     
    // Lancement en priorité basse : Windows donnera la main à l'IHM 
    // dès qu'un clic ou un mouvement de souris survient.
    ThreadExécute("Mon_THREAD", threadPrioritéBasse, ProcedureLongue)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    PROCÉDURE ProcedureLongue()
     
     
    // 1. On crée un "raccourci" (Procédure interne)
    // Cela permet de juste écrire : ProcNotifier("Mon message")
    Procédure interne ProcNotifier(sTexte est une chaîne)
        // On envoie l'adresse de la chaîne à la fenêtre
        PosteMessage(FEN_Sauvegarde, WM_UPDATE_STATUS, &sTexte, 0)
        // On laisse un tout petit temps (1ms) pour que l'OS traite le message 
        // si on envoie beaucoup de messages à la suite
        Multitâche(-1) 
    FIN
     
     
    // --- DÉBUT DU TRAVAIL RÉEL ---
     
     
    ProcNotifier("Initialisation de la sauvegarde.....")
    // [Ton code ici...]
     
     
    IF gbArretDemande THEN GOTO FinAnnulee
     
     
    ProcNotifier("Calcul de la taille des fichiers.....")
    // [Ton code ici...]
     
     
    IF gbArretDemande THEN GOTO FinAnnulee
     
     
    ProcNotifier("Copie en cours : Fichier 1/100")
    // [Ton code ici...]
     
     
    // --- FIN DU TRAVAIL ---
    PosteMessage(FEN_Sauvegarde, WM_FIN_THREAD, Vrai, 0)
    RETOUR
     
     
    FinAnnulee:
    PosteMessage(FEN_Sauvegarde, WM_FIN_THREAD, Faux, 0)
    Coome je l’ai dit, je n’ai pas mon Windev sous la main, et je ne garantie pas malgré mon prompt, que Gemini, n’ai pas commis d’approximation, mais l’idée est là…

    Pour ton PB passer par des messages système est plus propre et plus fiable tout en soulageant ton CPU

  4. #24
    Membre éclairé
    Homme Profil pro
    Informaticien en retraite ...
    Inscrit en
    Janvier 2008
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Informaticien en retraite ...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 511
    Par défaut
    Bonsoir,

    J'ai relu votre message, et je reste toujours étonné de votre agressivité
    Pour le tutoiement, passe, bien des personnes ne maitrise pas les subtilité de la langue Française

    C'est vrais que la fonction "Événement" a été évoqué quelque fois, et j'ai même essayé avec le double clique
    Je ne suis pas arrivé à concrétiser, mais peut être est-ce à cause de mon manque de maitrise de Windev

    Mais je rassure tous ceux qui pourrais nous lire
    Mon code marche parfaitement ... Et il ne semble pas que le temps de traitement soit si amplifié que cela

    Je vais étudier votre code et essayer de l'adapter à mon problème
    Par contre, je ne saisis pas vraiment ce que vous lui reprochez ....
    Est-ce le fait que je passe par une procédure pour afficher les "ToastAffiche" ?
    Car pour l'arrêt il semble que vous ayez conservé la solution du bouton STOP ...

    Si vous pouviez retrouver un Windev et me présenter un code testé, qui marche, et qui réponde au problème posé .........

    Cordialement
    SC

  5. #25
    Membre éclairé
    Homme Profil pro
    Informaticien en retraite ...
    Inscrit en
    Janvier 2008
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Informaticien en retraite ...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 511
    Par défaut
    RE bonsoir

    Effectivement, l'affichage des threads était incorrect... J'avais un affichage décalé
    Il ne faut pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExécuteThreadPrincipal(ToastAffiche)
    Mais il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecuteMainThread(ToastAffiche)
    J'ai fait plusieurs modifications et épurements dans mes codes
    Pour ceux que cela intéresse, faites-moi la demande

    Mais "Événement" m’intéresse... Si une personne de bonne volonté pouvait me donner un exemple le plus complet possible, où l'utilisateur ne cliquerait pas sur un bouton mais presserait la touche ESC pour arrêter la longue procédure, je suis preneur !!!!

    Cordialement
    SC

  6. #26
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 234
    Par défaut
    Aucune agressivité de ma part, j’essaie juste d’expliquer que de s’appuyer sur « ThreadPause(200) » est autres joyeusetés du même acabits, n’est pas une bonne approche…

    Et modestement, j’essaie de t’orienter vers une approche plus fiable sur le long terme, allez un petit Smilley pour la bonne humeur


    Et vous avez raison sur ma maîtrise de la langue française, je suis Breton…

  7. #27
    Membre éclairé
    Homme Profil pro
    Informaticien en retraite ...
    Inscrit en
    Janvier 2008
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Informaticien en retraite ...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 511
    Par défaut
    Citation Envoyé par der§en Voir le message
    Aucune agressivité de ma part, j’essaie juste d’expliquer que de s’appuyer sur « ThreadPause(200) » est autres joyeusetés du même acabits, n’est pas une bonne approche…

    Et modestement, j’essaie de t’orienter vers une approche plus fiable sur le long terme, allez un petit Smilley pour la bonne humeur


    Et vous avez raison sur ma maîtrise de la langue française, je suis Breton…
    Bonjour,
    Effectivement, si vous êtes Breton ........

    Si votre désir est d'aider, il faut donner des exemples de code qui ont été testés, ne pas vous contenter de souligner les erreurs ..
    Cordialement
    SC

  8. #28
    Expert confirmé
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 667
    Par défaut
    Bonjour,
    Citation Envoyé par scn68100 Voir le message
    Il ne faut pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExécuteThreadPrincipal(ToastAffiche)
    Mais il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecuteMainThread(ToastAffiche)
    Ta correction quelle qu'elle soit n'est pas là : Ce sont les 2 mêmes instructions la première est écrite en français et l'autre en anglais. Cf doc
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  9. #29
    Membre éclairé
    Homme Profil pro
    Informaticien en retraite ...
    Inscrit en
    Janvier 2008
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Informaticien en retraite ...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 511
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Bonjour,


    Ta correction quelle qu'elle soit n'est pas là : Ce sont les 2 mêmes instructions la première est écrite en français et l'autre en anglais. Cf doc
    Bonjour et merci de votre aide
    Effectivement j'ai modifié le code et j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecuteMainThread(ToastAffiche)
    Je me rend compte que j'ai mit mon code en ligne bien trop tôt ... J'ai porté ensuite pas mal de petites mais importantes modifications

    Je le ferait dés que j'aurais exploité pendant quelque temps
    Cordialement
    SC

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. prévenir utilisateur début / fin de traitement
    Par CobolProgrammator dans le forum EDT/SwingWorker
    Réponses: 9
    Dernier message: 06/10/2013, 22h53
  2. Interrompre un traitement déclenché par un évènement
    Par ailonn dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/12/2012, 12h52
  3. [XL-2003] Traitement utilisateur puis continuation du traitement automatique
    Par brownthefou dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/05/2012, 11h28
  4. Faire patienter l'utilisateur pendant un long traitement
    Par M E H D I dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 20/05/2010, 12h46
  5. Un export peut-il interrompre un traitement ?
    Par Thomf dans le forum Import/Export
    Réponses: 2
    Dernier message: 30/12/2009, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo