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 :

Forcer Windows à effectuer le writeln complet ?


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut Forcer Windows à effectuer le writeln complet ?
    Bonjour à tous,


    Avant de poser ma question je vous explique comment fonctionne mon logiciel :

    J'ai une classe on va dire TDisque.
    J'ai un thread (monThread) qui fait régulièrement (très régulièrement ... toutes les 100ms on va dire ... peut être moins même) appel à la méthode TDisque.AjouterHistorique(...).

    AjouterHistorique a pour objectif tout simple d'ajouter une chaine de caractère TOUJORUS DANS UN MEME FICHIER.

    Ainsi je me suis dit :
    Dans Create de TDisque j'ouvre mon fichier historique une bonne fois pour toute et dans AjouterHistorique je n'ai qu'à faire un Writeln (après formatage de ma chaine comme je le désire). En gros c'est comme si j'avais ça :
    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
     
    TDisque = class
    protected 
      fFicHistorique : TextFile;
    public
     constructor Create(aNom: string);
     destructor Destroy;
     procedure AjouterHistorique(chaine: string);
    end;
    ...
     
     
    constructor TDisque.Create(aNom: string);
    begin
     ...
     AssignFile(fFicHistorique,aNom);
    Rewrite(fFicHistorique);
    ...
    end;
     
    destructor TDisque.Destroy;
    begin
      CloseFile(fFicHistorique);
    end;
     
    procedure TDisque.AjouterHistorique(chaine: string);
    var maChaine: string;
    begin
     maChaine := ....... chaine .....
    ...
     Writeln(fFicHistorique,maChaine)
    end;
    Quel est alors le problème ? =>
    Le problème est que tel quel, les dernières lignes n'ont pas le temps de s'écrirent complètement (certaine n'y sont pas du tout, la dernière écrite est complètement tronquée).


    Le problème vient vraiment du fait que je garde ouvert non stop ce fichier. Existe-t-il donc un moyen pour que mes lignes s'écrivent correctement et complètement ? (autre que ouvrir et ferme le fichier à chaque fois, puisque c'est ce que je cherche à éviter)
    Comment remédier à ce problème ?



    Par avance merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    As-tu plusieurs Threads sur le même fichier ?
    Effectivement, pour mes logs, j'ouvre et je ferme systématiquement, je n'aime pas avoir un fichier ouvert tout le temps, et la fréquence était nettement supérieur ... disons plusieurs lignes en quelques milli-secondes ... et par rapport à la DB, eh bien, le temps n'était pas génant, même lorsque le fichier atteignant quelques centaines de Mo

    Attention, le caractère 14, n'est pas bien supporté, sinon voici l'une des variantes de fonction de log (je dois en écrire une à chaque fois que je change de boite, je recycle plus ou moins mes codes mais bon ... celle-ci date de 2002)

    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
    44
    45
    46
    procedure FichierLog(Fichier, Titre, BufferLog: String);
    var
       LogFile: File; //TextFile;
       NameFile, TimeLog: String;
       Buf: String;
    const
       LogDir = 'Log\';
       LogName = 'LOG_';
       LogExt = '.txt';
    begin
         // C:\...\MonProgramme.exe -> C:\...\MonProgramme\log\
         try
            TimeLog :=  FormatDateTime('dd/mm/yyyy hh:nn:ss:zzz',Now()) ;
            NameFile := ExtractFilePath(Application.ExeName) + LogDir + ChangeFileExt(ExtractFileName(Application.ExeName), '\');
            if not DirectoryExists(NameFile) then begin
               ForceDirectories(NameFile);
            end;
            NameFile := NameFile + LogName + Fichier + LogExt;
            try
               AssignFile(LogFile, NameFile);
               try
                  if not FileExists(NameFile) then begin
                     ReWrite(LogFile, 1);
                  end else begin
                      // Append(LogFile);
                      Reset(LogFile, 1);
                      Seek(LogFile, FileSize(LogFile));
                  end;
                  try
                     Buf := TimeLog + #9', ' + Titre+' :'#9+ BufferLog+#13#10;
                     // Buf[1] car BlockWrite écrit n octets à partir de la position Buf[1] !
                     BlockWrite(LogFile, Buf[1], Length(Buf));
                     // Write(LogFile, TimeLog + #9', ' + Canal+' :'#9+ BufferLog+#13#10) ;
                  except
                         Exit;
                  end;
               finally
                      CloseFile(LogFile);
               end;
            except
                   Exit;
            end ;
         except
                Exit;
         end ;
    end;
    et la fonction d'archivage

    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
    procedure ChangeLogServeurDirectory();
    var
       SearchItem:  TSearchRec;
       PathLog: String;
       BackUpPathLog: String;
       Compteur: Integer;
    const
       LogDir = 'Log\';
       BackUpDir = 'BackUp\';
       LogMaskExt = '*.*';
    begin
         // Si la date d'aujourd'hui est dépassée
         if gDateOfToDay < Date() then begin
            PathLog := ExtractFilePath(Application.ExeName) + LogDir + ChangeFileExt(ExtractFileName(Application.ExeName), '\');
            BackUpPathLog := PathLog + BackUpDir + 'Log ' + FormatDateTime('yyyy-mm-dd (dddd d mmmm)',Now()) + '\';
            gDateOfToDay := Date();
            Compteur := 1;
            while DirectoryExists( BackUpPathLog + 'No ' + IntToStr(Compteur) ) do begin
                  Compteur := Compteur + 1;
            end;
            BackUpPathLog := BackUpPathLog + 'No ' + IntToStr(Compteur) + '\';
            if not DirectoryExists(BackUpPathLog) then begin
               ForceDirectories(BackUpPathLog);
            end;
            try
               if FindFirst(PathLog + LogMaskExt, faAnyFile - faDirectory, SearchItem ) = 0 then begin
                  repeat
                        if (SearchItem.Name <> '.') and (SearchItem.Name <> '..')  then begin
                           if MoveFile( PChar(PathLog + SearchItem.Name), PChar(BackUpPathLog + ExtractFileName(SearchItem.Name)) ) then begin
                              beep;
                           end;
                        end;
                  until not ( FindNext(SearchItem) = 0 ); // Continuer tant que FindNext renvoi 0
               end;
            finally
                   FindClose(SearchItem);
            end;
         end;
    end;

  3. #3
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Salut ShaiLeTroll,

    Non je n'ai bien qu'un seul thread qui accède au fichier à la fois, de ce côté là y'a pas de soucis.

    Le problème et que le temps commence à devenir crucial dans ce projet, et je suis à la recherche du moindre gain, d'où ce désir de ne pas ouvrir et fermer non stop le fichier ...


    Mais bon ... je vais faire différents tests pour savoir si vraiment ça me change beaucoup de choses ....



    Merci pour ta réponse quoi qu'il en soit

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    Eh, bien, j'étais dans la même situation, lorsque je faisais des pilotage de trieuse de vêtement en temps-réel, j'avais 250 ms pour gérer le dispatch d'un article (Reception Code Barre, envoi d'un acquittement de reception du code, recherche de l'article dans la base, recherche d'un emplacement libre ou avec article similaire, envoi de la destination, reception acquittement de la confirmation de destination, refus pour la destination, ...) sachant que durant ces 250ms, je devais aussi gérer les status de la machine reçus tous les 50 ms, la reception de l'arrivée à destination d'un article, envoi de l'acquitement, erreur d'éjection d'un article qui n'a pas pu être mis à la destination prévue, ...

    sinon, la fonction que je t'ai passé prend environ 5 à 7 ms ... c'est vrai, que je n'avais pas mesuré le temps de log, mais ça en bouffe plus que je le pensais ... j'avais mis toute mon énergie à optimiser InterBase (j'ai eu des soucis avec les composants IB, je n'ai jamais pu trouver, à ce qu'il parait, il fallait préparer les requêtes explicitement, hors je construisais mes requêtes à la volée ... ça tenait, mais tout juste ...)

    Remplace, le TextFile, par un File, et écrit via BlockWrite (comme je l'ai fait mais en gardant le fichier ouvert), pour voir si cela est plus efficace, en tout, cela fait moins de traitement, ...

    c'est sure,
    Ouvert\Fermé = 1000 lignes en 9 secondes, donc ça fait 9ms par Appel
    Ouvert une fois = 1000 lignes en 16ms, lol, c'est imbattable, mes lignes sont complètes, mais j'utilise BlockWrite

    tient, code de goret de mon appli à bordel :

    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
    procedure AddLog(LogFile: TFileRec; const Titre, BufferLog: String);
    var
      TimeLog: String;
      Buf: String;
    begin
      try
        TimeLog :=  FormatDateTime('dd/mm/yyyy hh:nn:ss:zzz',Now()) ;
        try
          Buf := TimeLog + #9', ' + Titre+' :'#9+ BufferLog+#13#10;
          BlockWrite(File(LogFile), Buf[1], Length(Buf));
        except
          Exit;
        end;
      except
        Exit;
      end;
    end;
    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
    procedure TFrmTestFichier.BtnWriteLogClick(Sender: TObject);
    var
      I: Integer;
      LogFile: File;
      NameFile: String;
    const
       LogDir = 'Log\';
       LogName = 'LOG_';
       LogExt = '.txt';
    begin
      for I := 0 to 1000 do
        FichierLog('TestPerfLog', '', IntToStr(I));
     
      NameFile := ExtractFilePath(Application.ExeName) + LogDir + ChangeFileExt(ExtractFileName(Application.ExeName), '\');
      if not DirectoryExists(NameFile) then begin
         ForceDirectories(NameFile);
      end;
     
      NameFile := NameFile + LogName + 'TestPerfLog2' + LogExt;
      try
         AssignFile(LogFile, NameFile);
         if not FileExists(NameFile) then begin
            ReWrite(LogFile, 1);
         end else begin
             // Append(LogFile);
             Reset(LogFile, 1);
             Seek(LogFile, FileSize(LogFile));
         end;
     
         for I := 0 to 1000 do
           AddLog(TFileRec(LogFile), '', IntToStr(I));
     
     
      finally
         CloseFile(LogFile);
      end;
     
    end;

  5. #5
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    J'essaierai en BlockWrite dès demain y'a pas desoucis


    Et je te tiendrais au courant évidemment


    Merci beaucoup

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Bleys Voir le message
    Le problème vient vraiment du fait que je garde ouvert non stop ce fichier. Existe-t-il donc un moyen pour que mes lignes s'écrivent correctement et complètement ?
    T'as essayer le Flush?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var maChaine: string;
    begin
     maChaine := ....... chaine .....
    ...
     Writeln(fFicHistorique,maChaine);
     Flush(fFicHistorique); //This guarantees that all characters written 
                                  //to the file at that time have actually been 
                                 //written to the external file
    end;

  7. #7
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Non j'ai pas essayé ... Je testerais également demain


    Merci

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    normalement Flush est inclu dans WriteLn
    car WriteLn écrit dans le Buffer Texte du TTextFile, puis pour écrire réellement la valeur, il appelle Flush ...

    c'est la fonction Write que l'on utilise avec des éléments Char, Entier, Chaine, Record, qui néccessite un appel de Flush explicite

  9. #9
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Je croyais justement que WriteLn faisait appel à Write ?
    et ajoutait ensuite un CR/LF ? non ? M'aurait-on menti

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    WriteLn appel _WriteBytes, une fonction caché,
    Write c'est un truc encore plus compliqué, qui en fonction des paramètres passé va appeler une ou plusieurs des variantes possibles (char, integer, ... le compilateur nous fait tout ça pour nous, et normalement, il flush aussi ... ), ces dernières appelant _WriteBytes, suffit de lire system.pas et regarder l'ASM généré ...

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    WriteLn appel _WriteBytes, une fonction caché,
    Write c'est un truc encore plus compliqué, qui en fonction des paramètres passé va appeler une ou plusieurs des variantes possibles (char, integer, ... le compilateur nous fait tout ça pour nous, et normalement, il flush aussi ... ), ces dernières appelant _WriteBytes, suffit de lire system.pas et regarder l'ASM généré ...
    Effectivement on voit bien des call à Flush dans les unitées que tu cite...seulement la réalité m'amène à penser autrement.
    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
     
    Var
      f: textfile;
     
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      AssignFile(f, 'c:\testFlush.txt');
      Append(f);
      Writeln(f, 'I am appending some stuff to the end of the file.');
      //== Si on va voir le fichier avec notepad, il manque
      //== definitivement du text
    End;
    Procedure TForm1.Button2Click(Sender: TObject);
    Begin
      Writeln(f, 'I am appending some stuff to the end of the file.');
      //== Si on va voir le fichier avec notepad, il manque
      //== definitivement du text
    End;
    Procedure TForm1.Button3Click(Sender: TObject);
    Begin
      Flush(f); { ensures that the text was actually written to file }
      //== Si on va voir le fichier avec notepad
      //== Le Text est maintenant complet
    End;
    Procedure TForm1.Button4Click(Sender: TObject);
    Begin
      CloseFile(f);
    End;
    Les Flush inclus dans WriteLn sont appelé seulement lorsque le buffer interne
    est plein.

    C'est bien le comportement observé avec Delphi 5 du moins.

  12. #12
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Le Flush fonctionne à merveille ...




    Merci à vous deux pour votre aide et votre patience



    @ très bientot

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    Citation Envoyé par Eric Boisvert Voir le message
    Les Flush inclus dans WriteLn sont appelé seulement lorsque le buffer interne
    est plein.
    Oui, ça c'est fort possible, que le Flush ne soit appelé qu'à bon escient, ... c'est pour cela que je préfère de loin les fichiers binaires, c'est nettement plus direct, surtout qu'il devient ensuite très facile d'écire son code directement avec les API Windows, car les prototypes sont très similaires, ...

    Sinon, Bleys, quand j'ai un fichier ouvert longtemps, j'utilise souvent le TFileStream, ça permet beaucoup plus de chose qu'un TextFile ...

  14. #14
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Merci pour cette remarque ...


    Pour le moment je le laisse comme ça je verrais ensuite pour tout passer en binaire ...



    Sinon vis-à-vis du FileStream ... en fait je n'ai pas de traitement spécifique sur mon fichier à faire autre que d'ajouter des lignes ... je veux dire : que peut m'apporter le TFileStream sachant que mon but est simplement à un instant donnée d'ajouter une ligne (et ce très souvent on va dire ).

    Je tiens à faire remarquer que, dans un soucis de "en cas de plantage" je ne peux pas garder toutes les lignes en mémoire et enregistrer ensuite le tout dans un fichier à la fin du programme par exemple ...


    J'attends ta réponse

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 560
    Points : 25 153
    Points
    25 153
    Par défaut
    C'est évident, un log c'est fait pour être immédiat (TFileStream immédiat, comme BlockWrite, ou le Flush), sinon comment savoir ce qui plante ... en fait, je fait souvent des log texte, mais parfois binaire, avec son éditeur, ainsi, je sauvegarde, la date d'écriture du log, mais aussi les paramètres d'une fonction (Integer, string, Record, ou même component sérializé), mais c'est surtout durant la phase de débug d'une application, j'ai déjà saturé un disque de 40Go, parce qu'un jour j'avais oublié d'enlever les logs niveau 5 (user action, application action, system action, SQL, stack mouvement), en à peine quelques jours ... heureusement c'était encore la phase de mise en pré-production ...

    Le FileStream dans le cadre d'un fichier texte n'apporte grand chose ... c'est juste Objet, et ouvert si le besoin d'écrire le contenu d'un objet via un SaveToStream se manifeste un jour ...

  16. #16
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Ok très bien




    Merci pour ces infos supplémentaires

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/08/2014, 14h48
  2. Réponses: 3
    Dernier message: 16/11/2011, 08h41
  3. Forcer Windows à ne pas désactiver le média réseau
    Par yelbied dans le forum Windows XP
    Réponses: 1
    Dernier message: 10/06/2007, 23h23
  4. Forcer windows a recreer les noms courts 8.3
    Par lio33 dans le forum Windows
    Réponses: 3
    Dernier message: 22/09/2005, 08h52

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