Bonjour,
Je travail sur une machine qui a 254MB de mémoire et 630Mhz de puissance CPU. C'est pas super, mais c'est suffisant pour faire du windev.
Je fais des tests avec les threads et j'ai un petit problème.
J'ai une table.
Avec un premier thread je la remplit :
(Le code de création du signal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // Procédure exécutée par le premier thread BOUCLE SI i > 5000 ALORS SORTIR // pour ne pas avoir l'erreur de compilation FIN // on ajoute une ligne à la table TableAjoute(TableTest, "Nom" + i + TAB + "Prenom" + i) // on ouvre le signal : le thread 2 va reprendre son exécution (voir plus loin) SignalModifie(NomSignal, signalOuvert) i++ FIN
)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 NomSignal est une chaîne = "Signal1" SignalCrée(NomSignal, signalManuel, signalFermé)
Avec un second thread, je vide la table :
Le problème est à la ligne en rouge. Mais c'est pas vraiment là que se situe le problème, en fait, cette ligne en rouge m'a montrer qu'il y a une faille dans le code.
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 // code exécuté par le deuxième thread idFichier est un entier = fOuvre("C:\Mes Projets\Tests\Exe\lu.txt", foCréationSiInexistant) fPositionne(idFichier, 0, fpFin) BOUCLE // si la table est vide SI TableOccurrence(TableTest) = 0 ALORS // on ferme le signal SignalModifie(NomSignal, signalFermé) // on attend que le signal soit ouvert (que la table se remplisse) SignalAttend(NomSignal) FIN // on écrit la ligne de la table dans un fichier fEcritLigne(idFichier, TableTest[1][1]+TableTest[1][2]) // on supprime la ligne de la table TableSupprime(TableTest, 1) // on ferme le signal SignalModifie(NomSignal, signalFermé) SI L_TableTest = "yoluhou" ALORS SORTIR // pour ne pas avoir l'erreur... FIN FIN
L'erreur :
Ca veut dire que dans le thread 2, après être sortit de la fonction SignalAttend(), le tableau est toujours vide. Or c'est impossible vu que s'il on est sortit de cette fonction (SignalAttend()) c'est que le thread 1 vient d'ajouter un enregistrement dans la table.Erreur à la ligne 36 du traitement Procédure locale ProcedureThread2.
La liste est vide.
Aucun indice n'est valide pour le champ TableTest.
(Indice spécifié : 1).
Je sais que c'est plus compliqué que ça, ça se joue à la micro-seconde... Et en mettant la ligne ThreadAttendSignal(100) juste après la fonction SignalAttend() du thread 2, ça fait l'erreur moins facilement.
Est-ce que je devrais pouvoir trouver une manière de résoudre ce problème en faisant un diagramme de séquence?
Merci de me dire ce que vous en pensez.
Partager