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 :

[D7][Mutex] ne fonctionne pas comme attendu !


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut [D7][Mutex] ne fonctionne pas comme attendu !
    Bonjour.

    J'ai un problème de synchronisation qui relève pourtant presque du cas d'école à propos des ressources partagées. Un processus qui écrit (insertion) et un processus qui lit(extraction). Un mutex pour empêcher les accès simultanés.

    Voilà comment j'ai codé la chose.


    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
    // Création des mutex.
    procedure TGlobal.CreateAllMutex;
        begin
            FMutexAccesBufferDefauts := CreateMutex(nil,false,PChar('Defauts'+m_sMutexSufixe));
        end;
     
     
     
    // Fonction de lecture et extraction dans la ressource partagée.
    function TBuffer.ExtractTrame(var sComment : string ; Mutex : THandle):integer ;
        begin
            Result := -2 ; // Echec de l'obtention du verrou.
            // Tentative d'obtention du vérrou.
            TraceMessage(format('Le buffer "%0:s" attend le mutex pour lecture du fichier;mutex n°%1:d',[FName,Mutex]));
            WaitForSingleObject(Mutex,INFINITE);
            try
                // Vérrou obtenu.
                TraceMessage(format('Le buffer "%0:s" a pris le mutex pour lecture du fichier;mutex n°%1:d',[FName,Mutex]));
    		// FAIT DIVERS TRAITEMENTS ...
    			...
    			...
    			et notemment : TraceMessage('TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 ...');
    			...
    			...
                // Libération du vérrou.
            Finally
                ReleaseMutex(Mutex);
                TraceMessage(format('Le buffer "%0:s" a libéré le mutex après lecture du fichier;mutex n°%1:d',[FName,Mutex]));
            end;
        end;
     
     
     
    // Fonction d'écriture (insertion) dans la ressource partagée.
    function AddDefaultPurDelphi(...)
        begin
            TraceMessage('La fonction ATTEND le mutex ;mutex n°'+inttostr(g.FMutexAccesBufferDefauts));
            // Tentative d'obtention du vérrou.
            WaitForSingleObject(g.FMutexAccesBufferDefauts,INFINITE);
            try
                // Vérrou obtenu.
                TraceMessage('La fonction A PRIS le mutex ;mutex n°'+inttostr(g.FMutexAccesBufferDefauts));
    		// FAIT DIVERS TRAITEMENTS ...
    			...
    			...
    			et notemment : TraceMessage('TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[1]>Mesu[1]>Type[1]>0>1>1>55>39>4>1');
    			...
    			...
            Finally
                // Libération du mutex.
                ReleaseMutex(g.FMutexAccesBufferDefauts);
                TraceMessage('La fonction a libéré le mutex ;mutex n°'+inttostr(g.FMutexAccesBufferDefauts));
            end;
        end;
     
     
    // Libération des mutex.
    procedure TGlobal.CloseAllMutex;
        begin
            if(FMutexAccesBufferDefauts<>0)then
            begin
                CloseHandle(FMutexAccesBufferDefauts);
            end;
        end;

    Les "TraceMessage" sont une petite fonction que j'ai codé pour observer ce qu'il se passe...
    Et voilà ce que j'ai obtenu ! (ordre contre-chronologique)



    2007-06-21 14:51:03:693 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction a libéré le mutex ;mutex n°1496
    2007-06-21 14:51:03:693 ; Dtt.dll (2.5.1.0) ; Out ; AddDefaultPurDelphi ; 01/01 ;
    2007-06-21 14:51:03:678 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sComment;>1>9
    2007-06-21 14:51:03:678 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iResult;1
    2007-06-21 14:51:03:662 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[10]>Mesu[10]>Type[10]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:662 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[9]>Mesu[9]>Type[9]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:647 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[8]>Mesu[8]>Type[8]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:647 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[7]>Mesu[7]>Type[7]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:631 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[6]>Mesu[6]>Type[6]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:615 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[5]>Mesu[5]>Type[5]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:615 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[4]>Mesu[4]>Type[4]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:584 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[3]>Mesu[3]>Type[3]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:568 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[2]>Mesu[2]>Type[2]>0>1>1>55>39>4>1
    2007-06-21 14:51:03:568 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.TimerThreadsWatchDog ; 01/01 ;Le Watchdog --> surveille --> Les Extracteurs
    2007-06-21 14:51:03:553 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-21 14:51:03>56407>210000030>>Observation>Desi[1]>Mesu[1]>Type[1]>0>1>1>55>39>4>1<= 1ere insertion (?!?)
    2007-06-21 14:51:03:537 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:521 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:521 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:506 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-21 14:51:03:506 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:475 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '56407' , 347,'2007-06-21 14:51:03','Observation','Desi[1]','Mesu[1]','Type[1]', 39, 1, 55, 4, 1 <= 1ere Extraction (?!?)
    2007-06-21 14:51:03:428 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:428 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°1496
    2007-06-21 14:51:03:428 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-21 14:51:03:412 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[10];Mesu[10];Type[10];
    2007-06-21 14:51:03:412 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[9];Mesu[9];Type[9];
    2007-06-21 14:51:03:412 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[8];Mesu[8];Type[8];
    2007-06-21 14:51:03:396 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[7];Mesu[7];Type[7];
    2007-06-21 14:51:03:396 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[6];Mesu[6];Type[6];
    2007-06-21 14:51:03:396 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[5];Mesu[5];Type[5];
    2007-06-21 14:51:03:381 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[4];Mesu[4];Type[4];
    2007-06-21 14:51:03:381 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[3];Mesu[3];Type[3];
    2007-06-21 14:51:03:381 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[2];Mesu[2];Type[2];
    2007-06-21 14:51:03:365 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[1];Mesu[1];Type[1];
    2007-06-21 14:51:03:365 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sComment;
    2007-06-21 14:51:03:365 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iIdPc;39
    2007-06-21 14:51:03:350 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iIdTypeProduit;1
    2007-06-21 14:51:03:350 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iModeRef;0
    2007-06-21 14:51:03:350 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sObservation;Observation
    2007-06-21 14:51:03:334 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sDtrPr;
    2007-06-21 14:51:03:334 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sDtrNs;NS
    2007-06-21 14:51:03:334 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sPrIndice;
    2007-06-21 14:51:03:318 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sPrNum;210000030
    2007-06-21 14:51:03:318 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sNumSerie;56407
    2007-06-21 14:51:03:318 ; Dtt.dll (2.5.1.0) ; In ; AddDefaultPurDelphi ; 01/01 ;
    2007-06-21 14:51:03:303 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction a pris le mutex ;mutex n°1496
    2007-06-21 14:51:03:303 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction attend le mutex ;mutex n°1496
    2007-06-21 14:51:03:303 ; () ; Message ; btnAddDefaultClick ; 01/01 ;Appel manuel

    Comme vous pouvez le voir, le mutex ne fait pas son travail... Où ai-je raté quelque chose ?
    Je travaille avec D7 et WinXP Pro. Mon application sera déployée plus tard sur un parc de WinXp Pro / WinNt.

    Si vous comprenez d'où viens mon erreur, vous m'aideriez beaucoup.
    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Une suggestion :
    as-tu vérifié les valeurs de retour de "WaitForSingleObject" ?
    Le mutex n'est effectivement pris que sur un code de retour WAIT_OBJECT_0, et la fonction peut renvoyer un autre code que celui-là.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    Bonjour Numéro 28.

    Merci pour ta piste dans ton post. J'ai donc un peu creusé et détaillé un peu plus mon code. Maintenant, je fait afficher le retour de la fonction WaitForSingleObject. Sauf que le résultat n'est toujours pas celui souhaité. L'erreur est peut-être ailleurs ?

    La preuve :
    2007-06-22 14:13:44:195 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction a libéré le mutex ;mutex n°3528
    2007-06-22 14:13:44:195 ; Dtt.dll (2.5.1.0) ; Out ; AddDefaultPurDelphi ; 01/01 ;
    2007-06-22 14:13:44:195 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sComment;>1>48
    2007-06-22 14:13:44:195 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iResult;1
    2007-06-22 14:13:44:180 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:44>23084>210000030>>Observation>Desi[12]>Mesu[12]>Type[12]>0>1>1>55>39>4>1
    2007-06-22 14:13:44:180 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:44>23084>210000030>>Observation>Desi[11]>Mesu[11]>Type[11]>0>1>1>55>39>4>1
    2007-06-22 14:13:44:180 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[10]>Mesu[10]>Type[10]>0>1>1>55>39>4>1
    2007-06-22 14:13:44:164 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°3528
    2007-06-22 14:13:44:164 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '84216' , 347,'2007-06-22 14:13:34','Observation','Desi[3]','Mesu[3]','Type[3]', 39, 1, 55, 4, 1
    2007-06-22 14:13:44:133 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier ; mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:44:133 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°3528
    2007-06-22 14:13:44:133 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-22 14:13:44:133 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°3528
    2007-06-22 14:13:44:117 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '84216' , 347,'2007-06-22 14:13:34','Observation','Desi[2]','Mesu[2]','Type[2]', 39, 1, 55, 4, 1
    2007-06-22 14:13:44:086 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier ; mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:44:086 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°3528
    2007-06-22 14:13:44:086 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-22 14:13:44:086 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°3528
    2007-06-22 14:13:44:008 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '84216' , 347,'2007-06-22 14:13:34','Observation','Desi[1]','Mesu[1]','Type[1]', 39, 1, 55, 4, 1
    2007-06-22 14:13:43:992 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier ; mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:43:977 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°3528
    2007-06-22 14:13:43:977 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-22 14:13:43:977 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°3528
    2007-06-22 14:13:43:961 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '72932' , 347,'2007-06-22 14:13:31','Observation','Desi[4]','Mesu[4]','Type[4]', 39, 1, 55, 4, 1
    2007-06-22 14:13:43:945 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier ; mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:43:945 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°3528
    2007-06-22 14:13:43:930 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts

    2007-06-22 14:13:43:930 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a libéré le mutex après lecture du fichier;mutex n°3528
    2007-06-22 14:13:43:898 ; Dtt.dll (2.5.1.0) ; Query ; TicketDePanneV4() ; 01/01 ;exec P_AddDefaultV04 '72932' , 347,'2007-06-22 14:13:31','Observation','Desi[3]','Mesu[3]','Type[3]', 39, 1, 55, 4, 1
    2007-06-22 14:13:43:883 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" a pris le mutex pour lecture du fichier ; mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:43:883 ; Dtt.dll (2.5.1.0) ; Message ; TBuffer.ExtractTrame ; 01/01 ;Le buffer "Defauts" attend le mutex pour lecture du fichier;mutex n°3528
    2007-06-22 14:13:43:883 ; Dtt.dll (2.5.1.0) ; Message ; TGlobal.MyOnTimerExtraction ; 01/01 ;Extraction du buffer des défauts
    2007-06-22 14:13:43:867 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[9]>Mesu[9]>Type[9]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:867 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[8]>Mesu[8]>Type[8]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:852 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[7]>Mesu[7]>Type[7]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:852 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[6]>Mesu[6]>Type[6]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:836 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[5]>Mesu[5]>Type[5]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:836 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[4]>Mesu[4]>Type[4]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:836 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[3]>Mesu[3]>Type[3]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:820 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[2]>Mesu[2]>Type[2]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:820 ; Dtt.dll (2.5.1.0) ; Message ; TBufferDefauts.AddTrame() ; 01/01 ;2007-06-22 14:13:43>23084>210000030>>Observation>Desi[1]>Mesu[1]>Type[1]>0>1>1>55>39>4>1
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[12];Mesu[12];Type[12];
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[11];Mesu[11];Type[11];
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[10];Mesu[10];Type[10];
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[9];Mesu[9];Type[9];
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[8];Mesu[8];Type[8];
    2007-06-22 14:13:43:805 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[7];Mesu[7];Type[7];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[6];Mesu[6];Type[6];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[5];Mesu[5];Type[5];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[4];Mesu[4];Type[4];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[3];Mesu[3];Type[3];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[2];Mesu[2];Type[2];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;UnDefautDuTicketDePanne;Desi[1];Mesu[1];Type[1];
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sComment;
    2007-06-22 14:13:43:789 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iIdPc;39
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iIdTypeProduit;1
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;iModeRef;0
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sObservation;Observation
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sDtrPr;
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sDtrNs;NS
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sPrIndice;
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sPrNum;210000030
    2007-06-22 14:13:43:773 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;sNumSerie;23084
    2007-06-22 14:13:43:758 ; Dtt.dll (2.5.1.0) ; In ; AddDefaultPurDelphi ; 01/01 ;

    2007-06-22 14:13:43:758 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction A PRIS le mutex ;mutex n°3528 ; WaitForSingleObject = WAIT_OBJECT_0
    2007-06-22 14:13:43:758 ; Dtt.dll (2.5.1.0) ; Message ; AddDefaultPurDelphi ; 01/01 ;La fonction ATTEND le mutex ;mutex n°3528
    2007-06-22 14:13:43:758 ; () ; Message ; btnAddDefaultClick ; 01/01 ;Appel manuel

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Un processus qui écrit (insertion) et un processus qui lit(extraction).
    As-t-on bien DEUX processus ou threads pour ce test ? Parce que le Mutex ne protégera rien si on est dans le même thread tout le temps ...

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    AddDefaultPurDelphi ecrit dans la ressource partagée (insère des données).

    Il s'agit d'une simple fonction ne dépendant d'aucune classe...
    Mon application étant en fait une dll, AddDefaultPurDelphi est une fonction exportée, et donc suceptible d'être appelée à tout moment par le programme qui utilise la dll.

    Par contre, pour la lecture dans la ressource partagée (l'extraction), autrefois, j'utilisais un thread. J'ai récemment décidé d'abolir les threads qui m'ont trop posés de problèmes par le passé et je l'ai donc remplacé par un timer (lequel se désactive le temps de son execution puis se réactive en sortant de l'évènement.

    J'avoue ne pas être très clair sur la question des threads/processus, surtout lorsque le projet est une dll et non un exe.

    Est-ce que celà apporte des éléments de réponse ?

  6. #6
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Je préfère penser que le Mutex et WaitForSingleObject fond bien leur travail.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    14:13:44:195 AddDefaultPurDelphi Liberation du Mutex
    14:13:43:930 ExtractTrame          Liberation du Mutex
    14:13:43:883 ExtractTrame         Prend le Mutex
    14:13:43:883 ExtractTrame         Attend le Mutex
    14:13:43:758 AddDefaultPurDelphi Prend le Mutex
    14:13:43:758 AddDefaultPurDelphi Attend le Mutex
    Si on regarde le timing, on peut fort bien imaginer que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1-AddDefaultPurDelphi Release() ce soit executé...
    2-Windows change de Thread... 
    3-on voit l'obtention et la liberation du Mutex par ExtractTrame 
    4-Windows revient au thread précédent...
    5-et c'est à ce moment que tu log AddDefaultPurDelphi Liberation du Mutex
    Ca te donne l'impression que le Mutex ne fonctionne pas bien...
    c'est plutôt ton instrument de musure qui créer cette impression.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    j'ai pas tout suivi, mais dans un seul est même process, il est plus simple d'utiliser une section critique, surtout qu'il est ici question d'attente infinie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     EntreCriticalSection(S);
     try
      ...
     finally
      LeaveCriticalSection(S);
     end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Donc plus de thread mais un timer ... Le MUTEX travaille correctement, il réserve l'utilisation à un seul thread, mais ici on a qu'un seul thread (le timer envoie un message pour le thread principal de la VCL). Et le scenario d'ERIC est Ok.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    Bonjour et merci pour vos éléments de réponses.

    Je ne suis pas sur d'avoir tout bien compris.

    Tout d'abord, je veux bien accepter que mon "espion" comme je l'appèle ne restitue pas les logs dans le bon ordre, malgré que j'ai vraiment tenté de faire en sorte que si. La preuve par son code simplifié :

    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
    procedure TraceMessageV03(TypeMessage : TTypeMessage ; sNomFonction, sMessage : string; bEcraserFichier : boolean = false; sModuleName : string = '' ; sTypeMessage : string = '');
    begin
            // ...
            // ici du code pour le formattage de la chaine à tracer...
            // ...
            if(not(assigned(g_scAccesEspion)))then // g_scAccesEspion est une section critique globale.
            begin
                g_scAccesEspion := TCriticalSection.create();
            end;
            g_scAccesEspion.Enter ;
            try
                    // ...
                    // Envoie la chaine à tracer par un SendMessage(...) à une application tierce spécialement dédiée à la réception de ces messages
                    // ...
            Finally
                g_scAccesEspion.Leave ;
            end;
        end;
    Donc pour voir si les mutex fonctionnenent correctement, j'ai tentée vais générer la trace du release AVANT de "releaser" effectivement contrairement à ce que je faisais avant, mais je n'ai réussi qu'à obtenir un problème inverse... Maintenant, c'est AddDefaultPurDelphi qui grille le mutex à ExtractTrame...

    Que faire pour garantir le bon déroulement des choses ? Dois-je passer en section critique ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/04/2015, 16h44
  2. [XL-2007] Comparaison de valeurs ne fonctionne pas comme attendu
    Par eric4459 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/05/2014, 17h55
  3. pthread et signal : fonctionne pas comme attendue
    Par contremaitre dans le forum POSIX
    Réponses: 0
    Dernier message: 01/08/2008, 12h22
  4. un if qui ne fonctionne pas comme je veux
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 27/07/2006, 15h12
  5. time.sleep() ne fonctionne pas comme souhaité
    Par Olivier_ dans le forum Général Python
    Réponses: 3
    Dernier message: 19/11/2005, 01h46

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