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 :
gestion des la copie vers RepA et copie dans la base avec plusieurs threads appelant
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()
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
Question : pourquoi mon programme n'arrive pas à synchroniser les threads ?
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)
Merci d'avance.
Partager