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

WinDev Discussion :

Problème de synchronisation des threads avec les sémaphores et signaux [WD20]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Par défaut Problème de synchronisation des threads avec les sémaphores et signaux
    Bonjour,

    Après avoir lu et relu (plusieurs fois) la discussion sur "Sémaphore et threads" de #cladoo
    et parcourus plusieurs fois l'exemple de la documentation "WD pool de threads"
    qui utilise sémaphore et signaux, je n'ai toujours pas réussi à résoudre mon problème.

    Mon programme fait la surveillance d'un répertoire RepA et son sous répertoire
    SousRepA(certains s'en souviennent )
    Lors d'un ajout de plusieurs fichiers textes avec differents noms dans le sous répertoire SousRepA
    le programme doit copier un seul fichier à la fois vers la racine RepA et le renommer
    en fichier.txt seul nom obligatoire pour tous les fichiers copié vers la racine.
    son contenu est ensuite transféré dans la base de données et seulement à ce moement on copie
    le fichier suivant.
    j'ai donc essayé de synchroniser la file d'attente avec les sémaphores et signaux, mais
    mon programme ne fonctionne toujours pas comme il faut. Le actions se dédoule en désorde comme par
    exemple:
    - le fichier.txt est suprimmé avant même que son contenu soit copier
    -il y a des conflits d'accès à la base de données etc..

    voici mon code:

    surveillace :

    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
     
    ThreadMode(threadSectionCritique)
    ....
    RepIn est une chaîne = "C:RepA"
     
     
    MoiMême..Libellé=(MoiMême..Enfoncé?"ON" SINON "OFF")
     
    SI BTN_On_Off..Enfoncé = Vrai ALORS
     
    	//destruction des anciens sémaphores
    	SémaphoreDétruit("SectionCritique")
     
    	//on commence par le premier thread
    	gnNumThread = 1
     
     
    	SémaphoreCrée("SectionCritique",1)
     
    	//nous créons deux signaux pour gérer les copies dans les dossiers et base de données
    	SignalCrée("copie", signalAutomatique, signalFermé)
    	SignalCrée("base",signalAutomatique,signalFermé)
     
    	//mise en surveillance du dossier spécifié
    	fSurveilleRépertoire(RepIn,_Traitement,fsCréationFichier + fsSuppressionFichier + fsModificationFichier + fsRenommage)
     
    SINON			
    	// Arrête la surveillance
    	fSurveilleStopTout()
    gestion des la copie vers RepA et copie dans la base avec plusieurs threads appelant
    les procédures copie (EtapeCopie) et et base de données (EtapeDonnées):


    les procédures:
    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
     
    PROCEDURE _Traitement(sNomRépertoire est une chaîne, sNomFichier est une chaîne, nTypeChangement est un entier, sParamètre)
     
    sMessage est une chaîne
    sElément est une chaîne = sNomRépertoire + ["\"] + sNomFichier
     
     
    SELON nTypeChangement
    CAS fsSuppressionFichier
     
    		…….
     
    	CAS fsCréationFichier		
    		// On teste l'existence du fichier, s'il n'existe pas, c'est un répertoire
    		SI fFichierExiste(sElément) = Faux ALORS
    			………..
    		SINON
     
    			SI (sElément [~] "SousRepA") ALORS
    			//sMessage = ChaîneConstruit("Le fichier <%1> a été ajouté", sElément)
    			//On exécute le thread		
     
    			ThreadExécute(csNomThread+gnNumThread,threadNormal,EtapeCopie,sElément)	
     
    			SignalAttend("copie")
     
    			//On incrémente le numéro du thread en cours
     
    			gnNumThread ++					
     
     
     
     
    		   SINON
     
     
    		   SI fFichierExiste(sElément)=Vrai ALORS
    				   ThreadExécute(csNomThread+gnNumThread,threadNormal,EtapeDonnées,sElément)				  
     
    				     SignalAttend("base")
     
         //On incrémente le numéro du thread en cours
    				   gnNumThread ++	
     
     
    		    SINON
     
    			FIN
     
     
    			FIN
     
    		FIN
    	CAS fsRenommage
    		………
     
    	CAS fsModificationFichier
    		……..
    	AUTRE CAS
    		…..
    		RETOUR
    FIN


    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
    66
    67
    68
    69
    70
    71
    72
    73
     
    PROCEDURE EtapeCopie(sElément)
     
    SignalModifie("copie",signalOuvert)
     
    SémaphoreDébut("SectionCritique")
     
    	SI fFichierExiste(RepIn + "\fichier.txt")=Vrai  ALORS 
     
    		SI fAttributLectureSeule(RepIn + "\fichier.txt",Faux) = Faux ET ErreurDétectée = Faux ALORS
    			ListeAjoute(LISTE_Fichiers,"Lecture seule enlevée!")
    		SINON
    			Erreur(ErreurInfo(errMessage))
    		FIN
     
    		SI fSupprime(RepIn + "\fichier.txt") = Vrai 
     
    			ListeAjoute(LISTE_Fichiers,"Fichier supprimé!")
    		SINON
    			Erreur("impossible de supprimer le fichier fichier.txt",ErreurInfo(errMessage))
    		FIN
     
     
    		SI fCopieFichier(sElément, RepIn + "\fichier.txt") =Vrai ALORS  
     
    		SINON
    			Erreur(ErreurInfo(errMessage))
    		FIN
     
    	ListeAjoute(LISTE_Fichiers,"signal reçu :-)")
     
    	SINON
    		SI fCopieFichier(sElément, RepIn + "\fichier.txt") =Vrai ALORS 
     
    			ListeAjoute(LISTE_Fichiers,"Fichier copié B!")
    		SINON
    			Erreur(ErreurInfo(errMessage))
    		FIN
     
    FIN
     
    SémaphoreFin("SectionCritique")
     
     
     
     
     
     
     
    PROCEDURE EtapeDonnées(sElément)
     
     
     
    	SignalModifie("base",signalOuvert)
     
     
    SémaphoreDébut("SectionCritique")
     
    		SI HImporteTexte(BASE, sElément, "Nfichier, Agence, Numéro, Nom, Prénom, Adresse", "," + Caract(127) + """" + Caract(127) + RC + Caract(127) + ".", hImpCréation) = Vrai 
     
     
    			ListeAjoute(LISTE_Fichiers,"Entrée zone base de données!")
     
    								SINON
     
    			Erreur(ErreurInfo(errMessage))
    		FIN
     
     
     
     
     
       SémaphoreFin("SectionCritique",1)
    Question : pourquoi mon programme n'arrive pas à synchroniser les threads ?

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Bonsoir,

    Hum... Tu peux nous expliquer simplement ce que tu souhaite comme résultat stp ? Car je pense qu'on peut faire autrement et plus simple qu'en synchronisant plusieurs thread.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 247
    Par défaut
    hello,
    je n'ai peut-être pas bien compris ton problème, mais tu peux essayer d'utiliser une pile.

    1 - Déclarer une pile dans le code de la fenêtre ou le code du programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaPile est une Pile de chaînes
    2 - Dans la procédure de surveillance tu empiles les noms de fichiers créés dans la pile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Empile(MaPile,NomFichier)
    3 - Tu as une procédure automatique qui s'exécute tous les x secondes (ou moins) et qui teste si il y a quelque chose dans la pile. Si oui on dépile et on traite le fichier dépilé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ElementPile est une chaîne
    SI MaPile..Occurrence <> 0 ALORS 
      Dépile(MaPile,ElementPile)
      // traitement du fichier ElementPile
    FIN
    Ami calmant, J.P

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 454
    Par défaut
    Bonjour,
    Ici j'aurai plutôt utilisé une file, puisqu'il s'agit de gérer une file d'attente. Ainsi les fichiers seront traités dans l'ordre d'arrivée (FIFO).

    Tatayo.

  5. #5
    Expert confirmé
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 590
    Par défaut
    Il me semble qu'on t'avait donné des pistes lors de la discussion précédente.

    Je ne pense pas qu'un ensemble de threads soit nécessaire (et encore). Un seul suffit. Avec un flistefichier associé ou non à une procédure. Tu vas, fichier par fichier, les traiter. Le truc est de ne pas relancer le traitement si le traitement précédent n'est pas terminé. L'utilisation d'un booléen est indiquée dans ce cas.

    Le et encore correspondrait à un programme indépendant qui ferait le traitement (automate).

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Par défaut
    Bonjour,

    @WDKyle je souhaite mettre un répertoire et ses sous répertoires sous surveillance, et quand on dépose
    plusieurs fichiers dans l'un des sous répertoires, le programme doit gérer la file d'attente
    avec la contrainte de copier un seul fichier dans le répertoire racine, et transférer son contenu dans la base
    de données.

    @jurassic pork & tatayo :
    -j'ai premièrement essayé le programme avec une file (pile), puisqu'il s'agit
    d'un programme qui tourne 24/24, comment détecter et traiter uniquement la liste des derniers fichiers
    ajoutés ?
    - quand on défile ou dépile, il y a une modification de la file d'attente, seulement comment accéder à l’élément
    défilé (dépilé) ?

    @frenchsting oui justement j'avais plusieurs pistes, celle des threads me semblait la plus adéquate, seulement
    mon programme ne traite pas bien la synchronisation avec un ou plusieurs threads.

    Merci à vous tous!

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

Discussions similaires

  1. Synchronisation des threads avec deux sémpahores
    Par pupucette dans le forum C++
    Réponses: 0
    Dernier message: 27/01/2013, 22h17
  2. utilisation des threads avec les ejb
    Par saylar222 dans le forum Java EE
    Réponses: 0
    Dernier message: 15/06/2012, 16h35
  3. Réponses: 3
    Dernier message: 02/07/2010, 15h50
  4. [g++] problème avec les sémaphores
    Par gorgonite dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 21/12/2006, 18h31
  5. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 11h52

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