輪詢與監看
程式平常會在背景定時重新讀取一些暫存器,讓面板畫面保持更新(這就是「輪詢」); 使用者也可以把特定幾個位移加進「監看清單」,讓這幾個位移被特別盯著。這一頁介紹 腳本怎麼操作這兩件事,以及它們跟腳本執行之間的互動。
poll.on()/poll.off():開關背景輪詢
poll.off() -- 關閉背景輪詢這個開關
poll.on() -- 打開背景輪詢這個開關這兩個函式做的事,跟畫面上手動下 poll off/poll on 指令完全一樣——是整個
程式的開關,不是只影響這支腳本,而且不會隨腳本結束自動復原。
⚠ 這兩個函式在腳本執行「期間」沒有任何可觀察的效果:背景輪詢本來就完全
不會在腳本執行的整段期間運作——不是因為它被 poll.off() 關掉了,是因為腳本
執行時,程式本來就沒有餘力去做背景輪詢這件事(不管這個開關是開是關都一樣,
下一頁「腳本執行的機制」會解釋原因)。所以在腳本裡的某個段落前後各呼叫一次
poll.off()/poll.on(),對那個段落本身不會有任何差別——不要以為這樣做
能讓那段期間更「乾淨」或更快。
這兩個函式唯一有意義的效果,是腳本結束之後背景輪詢是開是關——因為它跟
poll on/poll off 指令是同一個開關,而且不會隨腳本結束自動復原:如果腳本
呼叫了 poll.off()、之後沒有再呼叫 poll.on() 就結束了(不論是正常結束、
fail(),還是出錯或被中止),背景輪詢會維持在關閉狀態,就跟你自己手動下了
poll off 之後忘記開回來一樣,需要再手動(或用下一支腳本)呼叫 poll.on()
恢復。
watch.add/watch.remove/watch.clear:操作監看清單
watch.add(0x40) -- 把位移 0x40 加進目前分頁(掛載槽 0)的監看清單
watch.add(0x41, 1) -- 加進「掛載槽 1」自己的監看清單
watch.remove(0x40) -- 從掛載槽 0 的清單移除一個位移
watch.remove(0x41, 1) -- 從「掛載槽 1」自己的清單移除一個位移
watch.clear() -- 清空目前分頁全部掛載槽的監看清單這幾個函式操作的,就是使用者平常在畫面上對監看面板做的同一份清單——腳本可以用 它們幫忙一次布置好一組要盯的位移,或是在測試前後清理掉不需要的項目。
watch.remove(offset [, slot]) 的 slot 語意與 watch.add(offset, slot)
對稱:省略時只作用在掛載槽 0,帶 slot 時只移除那個掛載槽自己的項目——上面
watch.remove(0x41, 1) 才移得到 watch.add(0x41, 1) 加進去的那一筆;想一次
清掉一個分頁底下所有掛載槽的項目,還是用 watch.clear()。清單已滿、或加入
的 (offset, slot) 組合已經存在,watch.add 都不會讓腳本出錯,只在 Log 留
一筆 WARN;watch.remove 找不到對應項目也只是安靜地不做事。⚠ 帶 slot 時,
那個掛載槽必須先設定過:watch.add(offset, slot)/watch.remove(offset, slot) 若指向一個從未設定過的掛載槽,會直接讓腳本出錯並中止,不會用位址
0x00 靜默生效——加之前先確認 slot 是不是真的設定過。細節見
API 參考。
跟腳本執行的互動
腳本執行的整段期間,程式會完全用來跑這支腳本,背景輪詢與監看面板本身的畫面
更新不會發生——不是因為它們被 poll.off() 關掉了,是因為腳本執行期間程式沒有
餘力去做別的事。下一頁「腳本執行的機制」會完整解釋這是怎麼一回事;這裡只要記得:
腳本裡呼叫 watch.add() 這類函式,效果是「把這個位移登記進清單」,清單真正被
拿出來讀、畫面真正更新,要等到腳本結束、程式恢復背景輪詢之後才會發生。
接下來
下一頁說明腳本執行時到底是怎麼一回事:為什麼執行中面板會暫停更新、大概能跑多快, 以及什麼時候該寫腳本、什麼時候該考慮寫一顆 Plugin。