Hive注册表那点事(5.0 VS 6.0)
Hive 注冊(cè)表那點(diǎn)事( 5.0 VS 6.0 )
現(xiàn)象
?????? 5.0 移置到 6.0 上的時(shí)候,發(fā)現(xiàn) Hive-Registry 無(wú)效,具體的現(xiàn)象是在控制面板中屏幕校準(zhǔn)后 Cold Boot 機(jī)器校準(zhǔn)數(shù)據(jù)丟失。
?????? 環(huán)境變量 PRJ_ENABLE_REGFLUSH_THREAD 和 PRJ_ENABLE_FSREGHIVE 配置為 1 ,同時(shí)注冊(cè)表項(xiàng) "RegistryFlags " 配置為 0 。
分析
????? 首先溫習(xí)一下 Hive 注冊(cè)表信息更新的相關(guān)基本知識(shí)
通過(guò)配置注冊(cè)表 HKEY_LOCAL_MACHINE/init/BootVars 下的注冊(cè)項(xiàng) "RegistryFlags " 來(lái)配置 Hive 注冊(cè)表的數(shù)據(jù)更新方法。
注冊(cè)項(xiàng) "RegistryFlags " 可能的值及其含義如下:
| Dword value | Description |
| none or 0 | Default setting. Flushes the registry nondeterministically . |
| 1 | Enables aggressive flushing |
| 2 | Disables background flushing |
?????? 詳細(xì)解釋如下:
?????? 當(dāng)配置為 1 的情況下,將使用 Aggressive Flush 的方式來(lái)更新 Hive 數(shù)據(jù),也就是 Flush On Close ,即在每次調(diào)用 RegCloseKey 的時(shí)候會(huì)更新一次注冊(cè)表,顯然比較浪費(fèi)系統(tǒng)資源。
?????? 當(dāng)配置為 0 的情況下,使用 Lazy Flush 方式更新注冊(cè)表,這個(gè)也是系統(tǒng)默認(rèn)的情況。在這種配置情況下,如果依然想保存 Hive 注冊(cè)表中的更改項(xiàng)的話,有兩種如下兩種選擇:
>> 系統(tǒng)關(guān)機(jī)前調(diào)用 API RegFlushKey 將修改的注冊(cè)表項(xiàng)寫(xiě)入到存儲(chǔ)設(shè)備上,如果保存成功將返回成功的標(biāo)記。
>> 配置環(huán)境變量 PRJ_ENABLE_REGFLUSH_THREAD 來(lái)創(chuàng)建 Flush 進(jìn)程來(lái)定期更新 Hive 注冊(cè)表的改動(dòng)項(xiàng)。
?????? 創(chuàng)建的 Flush 線程的優(yōu)先級(jí)
| [HKEY_LOCAL_MACHINE/System/ObjectStore/RegFlush ] ; To monitor the flushing from an external process add "ActivityName " registry value. ; The activity name is a global named event that filesystem will signal on Registry Activity. ;?? "ActivityName "="" ; Create an thread in filesys to perform flushing ??? "SpawnThread "=dword:1 ; Make the thread IDLE priority ??? "FlushPriority256"=dword:FF ; ActivityThreshold specifies the # of reg activity before we force a flush ??? "ActivityThreshold "=dword:100 ; Timeout period in ms for a flush (flush occurs if there have been some changes during this period). ??? "FlushPeriod "=dword:1D4C0 |
?????? 系統(tǒng)會(huì)按照 SpawnThread 新建一個(gè)優(yōu)先級(jí)為 FlushPriority256 的線程,按照 FlushPeriod 周期性地去檢查注冊(cè)表的變化并加以保存。
????? 本案的分析
本文要重點(diǎn)說(shuō)明的就是這個(gè)地方, 5.0 中和 6.0 中 "FlushPeriod " 的默認(rèn)值是不一樣的, 5.0 中默認(rèn)值為 0x3E8 即 1000ms ,而 6.0 中為 0x1D4C0 ,即 120000ms 。這個(gè)地方的差異就造成了在 6.0 系統(tǒng)下注冊(cè)表的修改值不能夠及時(shí)的進(jìn)行保存。
針對(duì) 120000ms 的情況,也就是說(shuō),當(dāng)你修改了注冊(cè)表后,修改的注冊(cè)表值將會(huì)在大約 120000ms 后才刷新到存儲(chǔ)設(shè)備上,這也造成了在 6.0 上 Hive 注冊(cè)表不能夠保存的問(wèn)題。
解決方法
為了在 6.0 能夠及時(shí)的保存注冊(cè)表信息,需要將默認(rèn)的 "FlushPeriod " 的值改為比較小的值,可以在 Platform.reg 中添加如下的值來(lái)覆蓋系統(tǒng)的默認(rèn)值:
| [HKEY_LOCAL_MACHINE/System/ObjectStore/RegFlush ] ; Timeout period in ms for a flush (flush occurs if there have been some changes during this period). ??? "FlushPeriod "=dword:3E8 |
?????? 其實(shí) 6.0 上支持 Hive-Registry ,還需要比 5.0 上多配置一個(gè)環(huán)境變量即 PRJ_ENABLE_FSREGHIVE ,這個(gè)也應(yīng)該時(shí) 6.0 的一個(gè) Bug 。 ???
附帶說(shuō)一句, Windows Mobile6.5 上也存在類(lèi)似的問(wèn)題,在此不再贅述。
?
?
總結(jié)
以上是生活随笔為你收集整理的Hive注册表那点事(5.0 VS 6.0)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 你是否做好了代码的备份?
- 下一篇: 智能手机的开放与封闭刍议