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 :

Annuler un ZipAjouteFichier()


Sujet :

WinDev

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut Annuler un ZipAjouteFichier()
    Bonsoir,

    j'ai une petite question : j'utilise la fonction ZipajouteFichier ( ) pour intégrer de nouveaux fichiers à une archive.

    J'ai réussi a mettre en place une jauge de suivi de l acompression ( de 0 - 100%) , par contre je désire ajouter un bouton "Annuler" pour interrompre une compression en cours sur un gros fichier.

    Je ne sais pas comment "dire" a Windev "arrête l'ajout de ce fichier"

    Je suppose un SendMessage() , mais je sèche complètement.

    Auriez-vous une idée ?

    Merci d'avance et bon week-end

    Olviier

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    914
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 914
    Points : 1 496
    Points
    1 496
    Par défaut
    Bonsoir
    Regardes dans la collection pJauges et la fenetre Fenêtre_Jauge_XP, l'usage de la variable bArrêtDemandé

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Je n'avais pas pensé aux exemples didactiques !! seulement l'exemple complet WD_zip !

    Merci

    Olivier

  4. #4
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    C'est a nouveau moi, je déchante un peu, l'exemple cité (me semble en tout cas ... ) ne porte que sur une "banale" jauge et non sur une jauge lors d'une compression de fichier.

    Je peux recréer l'exemple avec plus ou moins les mêmes principes, mais je n'arrive toujours au même point :


    By wd_newbie

    J'ai testé avec ZipSupprimeFichier() , ZipFerme(),Ferme() a tout les coups, ça plante. Lors de a compression, j'affiche un groupe avec un label et une jauge sur fond de rectangle blanc et un bouton annuler :


    By wd_newbie

    C'est le clic sur "Annuler" qui doit m'arrêter la compression et me redonner la main, mais non , paf , ça plante ...

    Bon , vous me direz , le résultat est le bon , ça annule la compression, mais ça fait un peut négligé non ?

    Bonne soirée

    Olivier

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Salut à toi,

    Tu pourrais peut-être mettre ton code de compression dans un thread et arrêter ton thread via ton bouton d'annulation.

    a+

  6. #6
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Bonjour,

    je continue mon chemin de croix avec mon "zippage" .
    J'ai tester ton idée de mettre le zippage dans un Thread secondaire que je lance avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ThreadExécute("Zipper",threadNormal,Compression_Fichier,sMediaZip,sFichieraZipper)
    Dans mon bouton "Annuler" j'ai un bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadArrête("Zipper")
    Quand je lance la compression, tout se passe bien , tread est lancé, mais quand je clique sur "Annuler", le programme se fige et je n'ai plus la main.

    Si je vais dans l'explorateur de fichier et que je fais des "actualiser", je vois la taille de mon fichier zip s'incrémenter, preuve que mon thread continue a faire son bonhomme de chemin.

    Quand la compression est terminée, le programme reprend la main et le code situé après "ThredArrete()" est exécuté.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Salut,

    Citation Envoyé par wd_newbie Voir le message
    Quand je lance la compression, tout se passe bien , tread est lancé, mais quand je clique sur "Annuler", le programme se fige et je n'ai plus la main.

    Si je vais dans l'explorateur de fichier et que je fais des "actualiser", je vois la taille de mon fichier zip s'incrémenter, preuve que mon thread continue a faire son bonhomme de chemin.

    Quand la compression est terminée, le programme reprend la main et le code situé après "ThredArrete()" est exécuté.
    Tu devrais lire de plus près la doc sur la fonction ThreadArrête.
    Citation Envoyé par Documentation Windev - Fonction ThreadArrête
    la fonction ThreadArrête attend que la fonction du WLangage en cours (par exemple HLitPremier) soit terminée. Dans ce cas, la fonction ThreadArrête est bloquante.
    Dans ton cas, ThreadArrête se bloque en attendant la fin de ZipAjouteFichier.

    Apparemment, ZipAjouteFichier est une fonction bloquante (non interruptible) et tu ne pourras pas empêcher son exécution d'aller jusqu'à son terme, à moins d'intervenir directement sur le thread au niveau du système d'exploitation, ce que ne permet pas ThreadArrête.

    Là encore, les développeurs du framework Windev ont manqué d'inventivité, d'ingéniosité et d'esprit d'à propos.
    Pourtant, il y avait bien un moyen très simple pour permettre à nos programmes de piloter l'avancement de la fonction ZipAjouteFichier, grâce au message JaugeCompactage (1174) qui aurait pu être utilisé pour transmettre une information d'annulation de l'opération de compactage.

    De manière générale, il manque au WLangage une gestion de messages/événements applicatifs digne de ce nom. D'ailleurs la fonction Evénement ne concerne que Windows et seulement pour les champs et les fenêtres.

  8. #8
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Effectivement, c'est également la réponse donnée par le ST ...
    ... que l'on ne peut arrêter ce type de fonction , pas que c'est bête de ne pas y avoir mis une fonction d'annulation

    Bon je vais voir si je peux trouver quelque chose au niveau des APIs système

    Merci pour ton aide

    Olivier

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Salut à toi,

    Même en essayant de mettre un délai dans le ThreadArrête(..) ? ou en exécutant un ZipFerme(..) ?

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    bonjour,

    voici un truc tout à fait bestial (grouik grouik) pour tuer un thread. C'est nettement moins propre qu'un ThreadArrête mais on n' attend pas la fin de la fonction qui est en train de s'exécuter dans le thread. Les problèmes suivants peuvent intervenir après cette opération :
    1 - libérations mémoire non faite.
    2 - Désallocation d'objets non faite.
    3 - Dll utilisées par le thread dans un état non connu.
    4 - Difficulté à fermer l'application car des éléments ne sont plus reconnus.

    Alors voici la manip
    1 - En global on déclare un entier système :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThreadPID est un entier système
    2 - Dans la procédure du thread avant de lancer la procédure longue qu'on veut pouvoir interrompre on fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // récupération du thread ID
     ThreadPID = ExeDonnePID(exeTID)
    3 - Et pour interrompre le thread on peut alors essayer :
    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
     
    Résultat est un entier système
    nHandleThread est un entier système
     
    //on récupère le handle du thread 
    nHandleThread = API("Kernel32.dll","OpenThread",1,Faux,ThreadPID)
    SI nHandleThread  = 0 ALORS	
        API("KERNEL32.dll","GetLastError")
    	Info(ErreurInfo())
    FIN
     
    //on termine à l'arrache le thread
    Résultat = API("Kernel32.dll","TerminateThread",nHandleThread,0)
     SI Résultat = 0 ALORS
        API("KERNEL32.dll","GetLastError")
     Info(ErreurInfo())
     FIN
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par jurassic pork Voir le message

    voici un truc tout à fait bestial (grouik grouik) pour tuer un thread. C'est nettement moins propre qu'un ThreadArrête mais on n' attend pas la fin de la fonction qui est en train de s'exécuter dans le thread. Les problèmes suivants peuvent intervenir après cette opération :
    1 - libérations mémoire non faite.
    2 - Désallocation d'objets non faite.
    3 - Dll utilisées par le thread dans un état non connu.
    4 - Difficulté à fermer l'application car des éléments ne sont plus reconnus.

    Alors voici la manip
    @jurassic pork
    Je salue ton intervention qui mériterait d'apparaître dans le sous-forum "Contribuez".

    Cependant, et tu nous mets en garde, cette pratique n'est vraiment pas propre (programmation de "jurassic" cochon ), et son impact sur la gestion des ressources doit être sérieusement étudié au cas par cas.

    Ici, la fonction ZipAjouteFichier ouvre au moins 2 fichiers (le ZIP + celui en cours d'ajout) et un arrêt brutal du thread ne garantit pas que ces fichiers soient libérés, ni la mémoire associée.
    risque de fichiers verrouillés et de "fuite de mémoire"

    A wd_newbie de faire très attention.

    Peut-être existe-t-il une alternative aux fonctions ZIP de Windev, qui prendrait en charge l'annulation de la fonction ?

    Encore une autre piste de réflexion: réaliser la compression dans un processus à part qu'il est possible de "killer" avec plus de garanties sur la libération des ressources qu'un "kill" de thread.

  12. #12
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    OK, merci pour votre aide , je vais faire quelques tests avant de me lancer tête baissée dans le "TerminateThread".

    +

Discussions similaires

  1. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28
  2. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 09h56
  3. Annuler des transactions
    Par sgire dans le forum ASP
    Réponses: 2
    Dernier message: 04/05/2004, 09h31
  4. Annuler une suppression
    Par Harbaingan dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/04/2003, 14h59
  5. Réponses: 5
    Dernier message: 04/04/2003, 15h02

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