2016-05-16 39 views
2

在主頁按鈕上的Pharo海邊應用程序中,點擊所有數據將被保存在一個燃油文件中,其中一些類名稱爲Test.fl.如果我調用相同的主頁上,在以下兩種情況時,都在呼喚這個下面的代碼保存爲最新版本Test.fl文件,海邊:CannotDeleteFileException:無法刪除燃油文件的舊版本

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

並獲得例外:

CannotDeleteFileException:能不能刪除舊版本的文件的... \ Pharo3.0 \ Test.fl

而且我已經使用互斥允許另一個實例初審後得到執行,

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

但我仍得到相同的錯誤

CannotDeleteFileException:無法刪除舊版本的文件

請人幫助我這個來修復錯誤。

回答

5

你的直覺可能是正確的:兩個進程試圖同時寫入(刪除)同一個文件。您的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

它正在工作。我已經學習了一個類變量,並在類的初始化方法中初始化它。謝謝Max。 –

+0

很高興我能幫到你。 –

0

你不需要互斥體。 Pharo海邊每次處理一個請求。也就是說,這僅適用於文件寫入速度快的情況,因爲所有其他連接都等待寫入完成。如果不是,您需要在單獨的線程中完成寫入,然後確實控制對其的訪問