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 :

[Fichier] Gestion multi accès d'un fichier


Sujet :

Langage Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut [Fichier] Gestion multi accès d'un fichier
    J'ai une petit procédure générique qui me permet de faire un fichier log

    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
     
    procedure CreateLogFile(sFilename,sText : String);
    var
      FText : TextFile;
      sFile : String;
    begin
      if not DirectoryExists(GAPPPATH + '\log\') then
        CreateDir(PChar(GAPPPATH + '\log\')); 
      sFile :=GAPPPATH + '\log\'+ sFileName;
      AssignFile(FText,sFile);
      if FileExists(sFile) then
        Append(FText)
      else
        ReWrite(FText);
      try
        Writeln(FText,Trim(sText));
      finally
        Closefile(FText);
      end;
    end;
    Le problème c'est que cette procédure est appellée parfois par 5-10 voir 15 thread en même temps pour le même fichier.
    Le soucis c'est que parfois jai une erreur E/S 32, car il y a une ouverture/fermeture simultané sur le fichier log.
    Y a t il un moyen de savoir ou de mettre en pause ma procédure tant que le fichier est ouvert ?
    Une autre solution peut être ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  2. #2
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Essaye en utilisant
    TThread.Synchronize, voir aide

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Je n'ai pas la main sur les threads, ces threads viennent d'un IdHttpServeur.
    Le problème se pose au moment de la reception de plusieurs réponses.
    Il peut y en avoir 1 comme 10 d'un coup.


    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
     
    procedure TfrmMain.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    var
      i : integer;
      lst : TStringList;
    begin
      // récupération des paramètres
      lst := TStringList.Create;
      try
        MemoMessage(mmlog,'<Get> : ' + AContext.Connection.IOHandler.InputBufferAsString);
        for i := 0 to ARequestInfo.Params.Count -1 do
        begin
          Lst.Add(ARequestInfo.Params.Strings[i]);
          MemoMessage(mmLog,'Param : ' + lst.Strings[i]);
        end;
      finally
        lst.Free;
      end;
    end;
    MemoMessage Fait appel à la fonction CreateLogFile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure MemoMessage (Memo : TMemo; sText : String);
    begin
      CreateLogFile(FormatDateTime('YYYYMMDD',Now) + '.log',
                      DateToStr(Now) + ' ' + TimeToStr(Now) +  sText);
      while Memo.Lines.Count > 500 do
        Memo.Lines.Delete(0);
      Memo.Lines.Add('[' + DateToStr(Now) + ' ' + TimeToStr(Now) + '] ' + sText);
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut Re: [Fichier] Gestion multi accès d'un fichier
    Peut être en utilisant une variable static (constante affectable) du genre
    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
     
    procedure CreateLogFile(sFilename,sText : String);
    const _Libre_:Boolean=True;
    var
      FText : TextFile;
      sFile : String;
    begin
      ici faire une boucle qui attend que _Libre_=True, avec un repeat until ou un while
     
      _Libre_:=False;
     
      ton code de log
     
     _Libre_:=True;
    end;
    Attention ce n'est pas parfait, il existe quand même un laps de temps (trs petit) ou deux thread peuvent entrés en même temps dans la fonction (le temps de mettre la variable à false)

    L'autre solution serait de faire un petit objet
    chaque phrase du log est ajouter dans une file d'attente et l'objet (qui est un thread ou utiles un timer) les prends un par un pour les enregistrés

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Vu que ce ne sont que des logs, je crois que je vais faire une solution file d'attente.

    Merci
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Recherche EDI avec gestion multi-fichiers
    Par Rownlin dans le forum Autres EDI
    Réponses: 1
    Dernier message: 03/07/2012, 10h20
  2. Multi-accès a un fichier texte
    Par yvancoyaud dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2012, 21h55
  3. Réponses: 3
    Dernier message: 27/10/2007, 00h39
  4. Chemin d'accès d'un fichier
    Par guitaros dans le forum Langage
    Réponses: 6
    Dernier message: 16/01/2004, 09h27
  5. Manipulation de fichiers - gestion d'extensions
    Par ulukai dans le forum Linux
    Réponses: 13
    Dernier message: 02/07/2003, 15h28

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