「為什麼我的 ON IDLE 或 ON TIMER 沒有在設定的時間間隔內觸發?」

問題描述

透過 GDC 或瀏覽器執行 Genero 程式時,在正常情況下,ON IDLEON TIMER 應該每 10 秒就會觸發一次輸出。然而,當使用者最小化視窗或切換到其他瀏覽器分頁後,觸發的時間間隔可能會大幅延長——有時長達 180 秒甚至更久。

範例程式碼

MAIN
    MENU ""
        ON ACTION EXIT
            EXIT MENU
        ON ACTION current_time
            DISPLAY "ON ACTION current_time "|| CURRENT HOUR TO SECOND
        ON IDLE 10
            DISPLAY "ON IDLE " || CURRENT HOUR TO SECOND
        ON TIMER 10
            DISPLAY "ON TIMER " || CURRENT HOUR TO SECOND
        ON ACTION enterforeground
            DISPLAY "ON ACTION enterforeground "|| CURRENT HOUR TO SECOND
        ON ACTION enterbackground
            DISPLAY "ON ACTION enterbackground "|| CURRENT HOUR TO SECOND
    END MENU
END MAIN

根本原因:瀏覽器節流(Throttling)

Reuben 將這個現象歸因於「節流」(Throttling)——這是瀏覽器刻意對非作用中分頁實施的延遲機制。瀏覽器為了節省系統資源,會降低背景分頁中計時器的觸發頻率。

這個行為因瀏覽器和作業系統而異,但在現代瀏覽器中普遍存在。瀏覽器文件中有關於此機制的說明。

可用的前景/背景事件

範例中展示了兩個相關的 action:

  • ON ACTION enterforeground:當應用程式視窗重新變為作用中(使用者切回該分頁或還原視窗)時觸發。
  • ON ACTION enterbackground:當應用程式視窗切換到背景(使用者切換到其他分頁或最小化視窗)時觸發。

開發人員可以利用這兩個事件來偵測應用程式目前是在前景還是背景執行。

影響評估

Reuben 指出,這通常不是一個嚴重的問題,因為背景中執行的應用程式對使用者來說是不可見的。然而,若你的應用程式需要精確的計時間隔(例如即時監控、自動登出計時等),就需要特別注意這個問題。

可能的因應方式

Reuben 提到一個尚未經過實測的變通方法:播放無聲音訊(inaudible audio)可以防止瀏覽器對分頁實施節流。不過這個方法需要開發人員自行評估是否適合自己的應用場景。

原文:https://4js.com/ask-reuben/ig-308/  ·  有任何 Genero 技術問題或翻譯疑問,歡迎來信 support@t100.app