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

Langage Delphi Discussion :

Comment attendre la disponibilté d'un fichier ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut Comment attendre la disponibilté d'un fichier ?
    Bonjour à tous,

    j'ai un message d'erreur qui apparaît de temps lorsque j'ouvre une de mes projets dans mon programme.

    Je situe un peu le contexte :
    j'ai une application MDI dans laquelle j'ai sur une fiche un VirtualDrawTree.

    Lorsque j'ouvre un de mes projets créé avec mon programme,
    je maximise la form MDI et je fais dans le VirtualDrawTree.Onchange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .....
    .....
      HTML:=TStringList.Create;
      try
        HTML.LoadFromFile(Main.Path+'skins\default.tpl');
        HTML.Text:=FastReplace(HTML.Text, '{TITLE}', PR.Title);
        .....
        .....
        HTML.SaveToFile(Path+'\temp.html');
      finally
        HTML.Free;
      end;
    .....
    .....
    Le truc qui se passe c'est que le OnChange se lance 2 fois, et donc parfois mon fichier temp.html est "locké" par le premier passage, du coup j'ai une erreur qui est générée.

    "Impossible de créer le fichier ..temp.html, le fichier est utilisé par un autre processus"
    Comment puis-je faire pour ne pas avoir cette erreur ? Y-a-t-il un moyen d'attendre que le fichier soit disponible ?

    Biensûr je ne peux pas déplacer le code dans un autre évènement.

  2. #2
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Peux-tu essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTML.LoadFromFile(Path+'skins\default.tpl');
    Le "main" est viré...

    Enfin, si c'est la même page.

    @+

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Tu pourra peut-être faire un "sleep" dans ton code de 300ms (mais c'est pas la super solution).
    ou ajoute dans ton code une fonction pour éviter une deuxième exécution.
    ??!!

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Hello,

    Si je vire le "Main", le path n'existe pas.

    Désolé.

  5. #5
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bsr

    Ben et avec un variable globale ?

    Ex

    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
    var Busy : Boolean;
     
     
    .....
    .....
      if not Busy then
      begin
        Busy := True;
        HTML:=TStringList.Create;
        try
          HTML.LoadFromFile(Main.Path+'skins\default.tpl');
          HTML.Text:=FastReplace(HTML.Text, '{TITLE}', PR.Title);
          .....
          .....
          HTML.SaveToFile(Path+'\temp.html');
        finally
          HTML.Free;
          Busy := False;
        end;
      end;
    .....
    .....
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 747
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 747
    Points : 13 314
    Points
    13 314
    Par défaut
    Pour attendre, on pourrait imaginer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while TRUE do
    try
      HTML.SaveToFile(Path+'\temp.html');
      Break;
    except
      Sleep(10);
    end;
    Mais personnellement, je temporiserais plutôt l'écriture dans le fichier, le OnChange ne faisant que redémarrer un Timer responsable de la sauvegarde.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Apres tous vos commentaires, j'ai finalement opté pour la solution de la variable dans la section private.

    Le tout inséré dans un Try Finally End

    Merci à tous pour votre aide,

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 747
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 747
    Points : 13 314
    Points
    13 314
    Par défaut
    Fais tout de même attention!
    Si lors du DERNIER changement, Busy vaut TRUE, il te manquera la dernière modif dans ton fichier .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Comment attendre la fermeture d'un fichier access avant la suite du code
    Par JesusHansHuberVorme dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/12/2010, 19h27
  2. Attendre la disponibilté d'un fichier ?
    Par BobaL dans le forum Langage
    Réponses: 7
    Dernier message: 09/01/2009, 11h29
  3. Comment attendre la création d'un fichier pour le copier
    Par nicolas2603 dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/03/2008, 11h57
  4. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 16h35
  5. Réponses: 5
    Dernier message: 20/08/2002, 18h01

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