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.