2016-05-16 17 views
2

pharo海辺のアプリケーションでホームボタンをクリックすると、すべてのデータがTest.flという名前の燃料ファイルに保存されます。私は2つのインスタンスで一度に同じホーム・ページを呼び出す場合、両方が海辺:CannotDeleteFileException:古いバージョンの燃料ファイルを削除できません

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

、最新の更新プログラムとTest.flファイルを保存するためにコードの下にこれを呼び出すと例外になっています

CannotDeleteFileExceptionを:でした... \ Pharo3.0 \ Test.fl

そして、私は別のインスタンスが最初のインスタンスの後に実行を取得できるようにするためにミューテックスを使用しているに、ファイルの古いバージョンを削除しない

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

しかし、それでもまだ、私は同じエラーに

CannotDeleteFileException取得しています:誰がエラーを修正するために、この上で私を助けてください、ファイル

の古いバージョンを削除できませんでしたが。

答えて

5

あなたの直感は正しいでしょう:2つのプロセスが同じファイルを同時に書き込む(削除する)ことを試みています。ただし、Mutexアプローチは、コードを実行するたびに新しいMutexを作成するため、機能しません。すべてのプロセスがMutexの同じインスタンスを使用するように、クラスまたはインスタンス変数(コードの動作に応じて)にMutexを格納する必要があります。

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

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

注:それはなまけMutexを初期化しても安全ではない一般ある

あなたのコードは次のようになります。私は簡単にここでそれをやっています。

+0

これは機能しています。私はクラス変数を取って、それをクラスの初期化メソッドで初期化しました。ありがとうございます。 –

+0

うれしい私は助けることができます。 –

0

ミューテックスは必要ありません。 Pharoの海辺では、リクエストを1つずつ処理します。つまり、ファイル書き込みが高速で、他のすべての接続が書き込みを完了するのを待つ場合にのみ、これが機能します。そうでない場合は、別のスレッドで書き込みを行い、実際にそのアクセスを制御する必要があります。

関連する問題