我有一個類是TThread的後裔。我有一些只讀的公共屬性。如果主線程在線程處於活動狀態時讀取這些值,是否會遇到問題?TThread的後裔,訪問主線程的屬性
3
A
回答
8
如果通過「只讀屬性」,你的意思是TThread後裔本身不會改變它們,並且儘快初始化它們,然後不,一切都會好的(只要你確定線程是活着的,踢你每次請求屬性值)。
如果通過「只讀屬性」,你的意思是TThread後裔將是唯一一個改變他們,你會想要確保主線程正在讀取他們正在改變(除非他們是原子值,像整數)。
3
基本類型,如Integer
,Boolean
,Char
和Pointer
,隨時都可以閱讀。參考類型,如string
,接口和動態數組,只有在其他線程不可能同時分配新值的情況下才可以安全讀取。例如,使用臨界區或Synchronized
方法來確保線程在主線程正在讀取數據時不會修改該值。
您還必須記住,您讀取的任何值可能會在您使用該值時過期 - 該線程可能在您讀取該值和使用該值之間寫入了一個新值。
2
這取決於屬性類型和可能在其訪問器方法。
type
TMyThread = class(TThread)
private
FIntfield: integer;
public
property IntField: integer read FIntField;
end;
訪問此屬性不會是一個問題,因爲訪問32位值是一個原子操作。但是,如果該屬性大於32位或在主線程訪問時可能會更改的類引用,則會遇到麻煩。
相關問題
- 1. 德爾福TThread後裔返回結果
- 2. Java的訪問線程的類屬性
- 3. 從不同的線程訪問屬性
- 4. 從線程訪問Form1屬性
- 5. TThread線程安全嗎?
- 6. 如何從Delphi的主線程向TThread發送消息?
- 7. CDialog不是主框架的後裔
- 8. textarea的不接收後裔的CSS屬性
- 9. 複製從不同線程訪問的NSString的內存屬性
- 10. 如何獲得後裔類的屬性值
- 11. 如何從工作線程檢查主線程的屬性值?
- 12. 後裔
- 13. 訪問/從不同的線程更改UI元素屬性
- 14. 無法訪問其他線程組中的Jmeter屬性。
- 15. TThread訪問衝突終止/免費
- 16. MVC屬性中的HttpContext - 線程問題?
- 17. 如何從其他線程訪問主UI線程中的System.Windows.Threading.Dispatcher?
- 18. 如何從Java中的工作線程訪問主線程?
- 19. 在DataBinding中訪問屬性的屬性
- 20. 訪問屬性
- 21. 訪問屬性
- 22. 訪問屬性
- 23. 訪問屬性
- 24. 訪問屬性
- 25. 訪問屬性
- 26. 訪問屬性
- 27. 由後裔css與字符線困惑
- 28. 訪問遊戲對象在主線程
- 29. 使用回調訪問主線程
- 30. 訪問uiscrollview的delaycontenttouches屬性
完美答案!確切地說我需要的信息。我正在更新TThread後代中的值,並不是所有的值都是原子的。謝謝您的回答。 – 2009-04-28 17:26:05
如果你的代碼不是32位對齊的,甚至像「整數」這樣的「原子」值可能會失敗。 – 2009-04-28 17:26:17