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

Delphi Discussion :

Threads et notifications de création de fichier


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Par défaut Threads et notifications de création de fichier
    J'ai une application client Ole en Delphi qui imprime une série de documents Office en PDF.

    La sérialisation est gérée au moyen de threads surveillant un dossier:

    1 - un thread de surveillance est lancé juste avant l'impression de chaque document
    2 - le thread est terminé (et libéré) quand le fichier PDF est produit
    3 - quand le thread est terminé, le document suivant est imprimé

    Le probleme est:
    Sur la moitié des machines, le thread ne termine jamais ...
    Voici le code de la méthode Execute
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Procedure TThreadSurveillance.Execute;
    var
      Chemin  :Array[0..255] Of Char;
      Infos   :TSearchRec;
    begin
      // Initialisation ds données du Thread
      FHandleNotification    := INVALID_HANDLE_VALUE;
     
      // Boucle pincipale du Thread
      while not Terminated Do
      begin
        if FCheminASurveiller <> FCheminEnCours then
        begin
     
          // Une demande est en cours, on libère le Handle
          if FHandleNotification <> INVALID_HANDLE_VALUE then
          begin
            FindCloseChangeNotification(FHandleNotification);
            FHandleNotification := INVALID_HANDLE_VALUE;
          end;
     
          // Prise en compte de la nouvelle demande
          FCheminEnCours := FCheminASurveiller;
          if FCheminEnCours <> '' then
          begin
            FCheminEnCours := ExcludeTrailingPathDelimiter(FCheminEnCours);
            FHandleNotification := FindFirstChangeNotification(
              StrPCopy(Chemin,FCheminEnCours),     // Chemin à surveiler
              False,                              // Ne pas surveiller les sous-répertoires
              File_NOTIFY_CHANGE_File_NAME        // Surveiller les changements de noms
             +File_NOTIFY_CHANGE_LAST_WRITE);     // et les écritures
            // Mémorisation de l'heure de la demande
            FDateHeureVerification:=Now;
          end;
        end;
     
        if FHandleNotification <> INVALID_HANDLE_VALUE then
        begin
          //case WaitForSingleObject(FHandleNotification,200) Of
          case WaitForSingleObject(FHandleNotification,INFINITE) Of
            WAIT_Object_0:
            begin
              if SysUtils.FindFirst(FObjFileName.CompleteValue,faAnyFile,Infos)=0 then
              begin
                if FileDateToDateTime(Infos.Time) > FDateHeureVerification then
                begin
                  sysutils.FindClose(Infos);
                  Synchronize(FichierGenere);
                end;
                sysutils.FindClose(Infos);
              end;
            end;
            WAIT_TIMEOUT :;
          end;
          // Le handle doit être mis à jour pour pouvoir effectuer une nouvelle demande
          FindNextChangeNotification(FHandleNotification);
        end;
      end; // while not terminated
     
      // Libération du Handle en cas de besoin
      if FHandleNotification <> INVALID_HANDLE_VALUE then
         FindCloseChangeNotification(FHandleNotification);
      FHandleNotification := INVALID_HANDLE_VALUE;
    end;

  2. #2
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Bonjour.

    Il se peut que la boucle de gestion du Thread soit trop rapide.
    Ajoute un "Application.ProcessMessages" pour forcer la remonter des messages WINDOWS.

    A+

  3. #3
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Par défaut
    Cela ne change rien

Discussions similaires

  1. notification de création de fichier
    Par nixonne dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 27/03/2009, 20h10
  2. création de fichiers dans le disque dur
    Par sex-sansbol dans le forum ASP
    Réponses: 6
    Dernier message: 24/08/2004, 09h39
  3. Création de fichier
    Par gsxr man dans le forum ASP
    Réponses: 2
    Dernier message: 28/06/2004, 22h19
  4. Réponses: 8
    Dernier message: 03/09/2003, 00h47
  5. création de fichiers .x
    Par Pazz dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h33

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