2009-04-28 42 views

回答

8

如果通過「只讀屬性」,你的意思是TThread後裔本身不會改變它們,並且儘快初始化它們,然後不,一切都會好的(只要你確定線程是活着的,踢你每次請求屬性值)。

如果通過「只讀屬性」,你的意思是TThread後裔將是唯一一個改變他們,你會想要確保主線程正在讀取他們正在改變(除非他們是原子值,像整數)。

+0

完美答案!確切地說我需要的信息。我正在更新TThread後代中的值,並不是所有的值都是原子的。謝謝您的回答。 – 2009-04-28 17:26:05

+1

如果你的代碼不是32位對齊的,甚至像「整數」這樣的「原子」值可能會失敗。 – 2009-04-28 17:26:17

3

基本類型,如Integer,Boolean,CharPointer,隨時都可以閱讀。參考類型,如string,接口和動態數組,只有在其他線程不可能同時分配新值的情況下才可以安全讀取。例如,使用臨界區或Synchronized方法來確保線程在主線程正在讀取數據時不會修改該值。

您還必須記住,您讀取的任何值可能會在您使用該值時過期 - 該線程可能在您讀取該值和使用該值之間寫入了一個新值。

2

這取決於屬性類型和可能在其訪問器方法。

type 
    TMyThread = class(TThread) 
    private 
    FIntfield: integer; 
    public 
    property IntField: integer read FIntField; 
    end; 

訪問此屬性不會是一個問題,因爲訪問32位值是一個原子操作。但是,如果該屬性大於32位或在主線程訪問時可能會更改的類引用,則會遇到麻煩。