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 :

Multithread et fonction de log


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut Multithread et fonction de log
    Bonjour,

    Je voudrais savoir si je peux utiliser cette procedure à travers des threads différents sur le même fichier de log sans utiliser de Mutex dans cette procédure.
    Ne risque t'on pas d'avoir des execptions sur l'accès concurrent à ce fichier et ainsi créer a crash de l'appli?


    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
    procedure DoAddLog(FileName, Line: string);
    var
      LogFile: Text;
    begin
      try
        //Créé le fichier s'il n'éxiste pas
        if CreateLogFile(FileName, False) then
        begin
    {$I-}
          Assign(LogFile, FileName);
          Append(LogFile); 
          Writeln(LogFile, Line);
          CloseLogFile(LogFile);
    {$I+}
        end;
      except
        on E: EInOutError do
        begin
        end;
      else
        raise;
      end;
    end;

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    Utilisant beaucoup les Thread, je n'écris les logs dans le fichier qu'une fois à la fin du traitement (ça évite de sollicité en ouverture/écriture le fichier x fois)

    Sinon, j'utilise cette petite procedure pour mes logs

    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
     
    procedure CreateLogFile(sFilename,sText : String);
    var
      FText : TextFile;
      sFile, sDir : String;
    begin
      try
        // GAPPPATH est une variable globale contenant le chemin du logiciel
        sDir := GAPPPATH + '\logs\' + FormatDateTime('YYYY\MM\',Now);
     
        if not DirectoryExists(sDir) then
          ForceDirectories(sDir);
        sFile :=sDir + sFileName;
        AssignFile(FText,sFile);
        if FileExists(sFile) then
          Append(FText)
        else
          ReWrite(FText);
        try
          Writeln(FText,Trim(sText));
        finally
          Closefile(FText);
        end;
      Except on E:Exception do
        begin
          if IOResult = 32 then
            CreateLogFile(sFileName,sText)
          else
            ShowMessage(E.Message);
        end;
      end;
    end;
    PS: penses à utiliser les balises de code (le # dans la barre d'outils) pour tes bouts de source.
    Modérateur Delphi

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

  3. #3
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut
    Merci pour t'as procédure, mais peut on l'appeller à partir de plusieurs threads avec le même nom de fichier sans créer d'exception?
    Pourquoi relances tu la procédure lors de l'exception avec IOResult = 32?

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    Citation Envoyé par remus2968 Voir le message
    Pourquoi relances tu la procédure lors de l'exception avec IOResult = 32?
    C'est le cas où j'ai une exception car le fichier est déjà ouvert par un autre thread, donc si j'ai cette erreur, je relance une tentative d'écriture.
    Modérateur Delphi

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

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 115
    Par défaut
    Pour éviter les problèmes de partage, mettre l'ID du Handle dans le nom du fichier permet d'éviter ce problème ...

    Si tu veux avoir qu'un seul fichier de log, lorsque j'ai beaucoup de thread simultané (seul FastMM permet d'avoir un grand nombre sans trop de perte de perf), ils n'écrivent pas le log dans un fichier mais dans une threadliste utilisé par un autre thread (souvent le OnIdle de l'Application, ou carrément un thread séparé) dédié au log qui lui écrira le log en traitant la liste comme une FIFO, biensur, j'ai aussi la fonction pour écrire réellement dans le log pour les cas ou je veux être sur que l'écriture à eu lieu ... le fichier étant géré par une section critique dans mon programme pour gérer préventivement les locks au lieu de laisser faire des erreurs ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut
    Merci pour vos réponses. Je vais opter pour l'utilisation d'un mutex sur cette procédure comme ça plus de soucis de gestion d'exceptions.

Discussions similaires

  1. Construction d'une fonction de log d'erreur
    Par vdary dans le forum Programmation système
    Réponses: 0
    Dernier message: 22/09/2012, 17h14
  2. admin différencier en fonction du log htpasswd
    Par gotcha5832 dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2011, 12h39
  3. MultiThreading et fichier de log
    Par Te-Deum dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/09/2008, 08h32
  4. fonction mathematiques LOG
    Par stephyugh dans le forum DB2
    Réponses: 1
    Dernier message: 17/10/2007, 15h55
  5. MultiThread et fonction InternetOpen
    Par firejocker dans le forum C++
    Réponses: 8
    Dernier message: 02/10/2006, 18h25

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