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:
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:
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:
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.