2016-05-16 2 views
2

Dans l'application Pharo Seaside sur le bouton d'accueil, toutes les données seront enregistrées dans un fichier de carburant avec un nom de classe comme Test.fl. Si j'appelle la même page d'accueil à la fois dans deux cas, les deux sont sous le code appelant cette pour enregistrer le fichier Test.fl avec les dernières mises à jour,Seaside: CannotDeleteFileException: Impossible de supprimer l'ancienne version du fichier de carburant

FLSerializer 
    serialize: self allObjects 
    toFileNamed: self name , '.fl'** 

et faire exception:

CannotDeleteFileException: Peut- pas supprimer l'ancienne version du fichier ... \ Pharo3.0 \ Test.fl

Et je l'ai utilisé Mutex pour permettre une autre instance pour obtenir exécuté après la première instance,

mutexBlock := Mutex new. 
mutexBlock critical: [ 
    FLSerializer 
     serialize: self allObjects 
     toFileNamed: self name , '.fl' ] 

Mais je reçois la même erreur

CannotDeleteFileException: Impossible de supprimer l'ancienne version du fichier

S'il vous plaît quelqu'un me aider à ce sujet pour corriger l'erreur.

Répondre

5

Votre intuition est probablement correcte: deux processus tentent d'écrire (supprimer) le même fichier en même temps. Votre approche Mutex ne fonctionnera pas cependant parce que vous créez un nouveau Mutex chaque fois que vous exécutez ce code. Vous devez stocker le Mutex dans une classe ou une variable d'instance (selon le fonctionnement de votre code) de sorte que chaque processus utilise la même instance du Mutex.

Votre code serait alors ressembler à quelque chose comme ceci:

MyClass class>>serializeProtect 
    ^SerializeProtect ifNil: [ SerializeProtect := Mutex new ] 

self class serializeProtect critical: [ 
    FLSerializer 
     serialize: self allObjects 
     toFileNamed: self name , '.fl' ] 

Note: il est généralement pas sûr à initialiser un Mutex paresseusement. Je le fais simplement ici pour des raisons de simplicité.

+0

Cela fonctionne. J'ai pris une variable de classe et l'ai initialisée dans la méthode initialize de la classe. Merci Max. –

+0

Content de pouvoir aider. –

0

Vous n'avez pas besoin d'un mutex. Seaside dans Pharo traite les demandes une à la fois. C'est-à-dire que cela ne fonctionne que si l'écriture de votre fichier est rapide, car toutes les autres connexions attendent que l'écriture soit terminée. Si ce n'est pas le cas, vous aurez besoin de faire l'écriture dans un fil séparé, puis de contrôler l'accès