指定した時間間隔で、自動的に繰り返し関数を呼び出します。
SetTimer Function, Period, Priority
型:機能オブジェクト
呼び出す関数オブジェクト。
関数オブジェクトへの参照は、スクリプトのタイマーリストに保持され、タイマーが削除されない限り解放されない。これはランワンスタイマーでは自動的に行われますが、SetTimerをPeriodを0にして呼び出すことによっても行うことができます。
Functionが省略された場合、SetTimerは現在のスレッドを起動したタイマーを操作します(もしあれば)。例えば、SetTimer , 0
をタイマー関数内で使用すると、タイマーを削除するためにマークすることができ、SetTimer , 1000
は現在のタイマーの周期を更新します。
注:空の変数や空の値をもたらす式を渡すとエラーとみなされます。このパラメータには、空でない値を与えるか、完全に省略する必要があります。
型:整数
If omitted and the timer does not exist, it will be created with a period of 250. If omitted and the timer already exists, it will be reset at its former period unless Priority is specified. Otherwise, the absolute value of this parameter is used as the approximate number of milliseconds that must pass before the timer is executed. タイマーは自動的にリセットされます。自動で繰り返す設定や、1回だけ実行する設定も可能です:
, 0を使用した場合と同様に、今から100 ms後にFunction
を呼び出し、タイマーを削除します。Periodの絶対値は、4294967295 ms(49.7日)以下でなければならない。
型:整数
省略したときの初期値は0です。Otherwise, specify an integer between -2147483648 and 2147483647 (or an expression) to indicate this timer's thread priority. 詳しくは「スレッド」をご覧ください。
既存のタイマーの優先順位を変更する場合、他の方法で影響を与えることなく、Periodを省略します。
タイマーは非同期で実行されるため、スクリプトがウィンドウを待っていたり、ダイアログを表示していたり、他のタスクで忙しかったりしても、指定した頻度(間隔)で実行されるため便利です。例えば、ユーザーがアイドル状態になったときに何らかのアクションを起こす(A_TimeIdleで反映される)、不要なウィンドウが表示されたらすぐに閉じるなど、さまざまな使い方があります。
タイマーは、スクリプトが同時に複数のタスクを実行しているように錯覚させるかもしれませんが、そうではありません。その代わり、タイムドファンクションは他のスレッドと同じように扱われます:ホットキーのサブルーチンなど、他のスレッドに割り込んだり、割り込まれたりする可能性があります。詳しくは「スレッド」をご覧ください。
タイマーを作成したり、新しい周期で更新したりすると、その関数はすぐに呼び出されることはありません。タイマーの初回実行を即座に行いたい場合は、タイマーの関数を直接呼び出します(ただし、タイマーのように新しいスレッドを開始しないので、SendModeなどの設定はデフォルトのままでは始まりません)。
リセット:SetTimerを既存のタイマーに使用した場合、タイマーはリセットされる(Priorityが指定され、Periodが省略された場合を除く)、言い換えれば、その関数が再び呼び出される前にその期間の全体が経過する必要がある。
タイマー精度:OSの時間管理システムの粒度のため、Periodは通常10または15.6ミリ秒の最も近い倍数に切り上げられます(インストールされているハードウェアとドライバの種類に依存します)。DllCall+timeBeginPeriod+Sleepのように、Loop+Sleepでより短い遅延を達成することもできる。
信頼性:以下のような条件下では、タイマーが期待通りの時刻に作動しないことがあります:
タイマーは、スクリプトが中断されても動作しますが、現在のスレッドが Thread NoTimersを有効にしている場合、またはいずれかのスレッドが一時停止された場合は、タイマーは動作しません。また、ユーザーがスクリプトのメニュー(トレイアイコンメニューやメニューバーなど)を操作しているときは、動作しません。
タイマーは、スクリプトの現在の活動を一時的に中断することで動作するため、長い中断が望ましくない場合は、タイマーの機能を短く保つ(すぐに終了するようにする)必要があります。
その他の備考:一時的なタイマーは、それ自体の機能で無効になることが多いかもしれません(このページの下の方にある例を参照してください)。
タイマーから関数が呼び出されると、SendModeなどの設定は常にデフォルト値で新しくスタートします。これらのデフォルトは、スクリプト起動時に変更することができます。
ゲームなどでホットキーの反応時間が重要で、スクリプトにタイマーが含まれていて、その関数の実行に約5ミリ秒以上かかる場合は、以下の関数を使用して15ミリ秒の遅延を回避してください。このような遅延は、タイマースレッドが中断しない期間にある瞬間にホットキーが押された場合に発生します:
Thread "Interrupt", 0 ; Make all threads always-interruptible.
タイマーが機能実行中に無効化された場合、その機能は完了するまで継続されます。
KeyHistory機能は、タイマーの存在と現在有効なタイマーの数を表示します。
スレッド、Thread(関数)、Critical、関数オブジェクト
SetTimer CloseMailWarnings, 250 CloseMailWarnings() { WinClose "Microsoft Outlook", "A timeout occured while communicating" WinClose "Microsoft Outlook", "A connection to the server could not be established" }
特定のウィンドウが表示されるのを待ち、ユーザーに警告を発する。
SetTimer Alert1, 500 Alert1() { if not WinExist("Video Conversion", "Process Complete") return ; それ以外の場合: SetTimer , 0 ; i.e. the timer turns itself off here. MsgBox "The video conversion is finished." }
ホットキーの単押し、二重押し、三重押しを検出します。これにより、ホットキーは押す回数によって異なる操作を行うことができます。
#c:: KeyWinC(ThisHotkey) ; This is a named function hotkey. { static winc_presses := 0 if winc_presses > 0 ; SetTimer already started, so we log the keypress instead. { winc_presses += 1 return } ; Otherwise, this is the first press of a new series. Set count to 1 and start ; the timer: winc_presses := 1 SetTimer After400, -400 ; Wait for more presses within a 400 millisecond window. After400() ; This is a nested function. { if winc_presses = 1 ; The key was pressed once. { Run "m:\" ; Open a folder. } else if winc_presses = 2 ; The key was pressed twice. { Run "m:\multimedia" ; Open a different folder. } else if winc_presses > 2 { MsgBox "Three or more clicks detected." } ; Regardless of which action above was triggered, reset the count to ; prepare for the next series of presses: winc_presses := 0 } }
Uses a method as the timer function.
counter := SecondCounter() counter.Start Sleep 5000 counter.Stop Sleep 2000 ; An example class for counting the seconds... class SecondCounter { __New() { this.interval := 1000 this.count := 0 ; Tick() has an implicit parameter "this" which is a reference to ; the object, so we need to create a function which encapsulates ; "this" and the method to call: this.timer := ObjBindMethod(this, "Tick") } Start() { SetTimer this.timer, this.interval ToolTip "Counter started" } Stop() { ; To turn off the timer, we must pass the same object as before: SetTimer this.timer, 0 ToolTip "Counter stopped at " this.count } ; In this example, the timer calls this method: Tick() { ToolTip ++this.count } }
上記の例に関連するヒント:
this.timer := this.Tick.Bind(this)
を使用することもできます。this.timer
が呼び出されると、実質的にtick_function.Call(this)
が呼び出されます。tick_functionはそのメソッドを実装した関数オブジェクトです。これに対し、ObjBindMethodは this.Tick()
を呼び出すオブジェクトを生成します。this.timer
の代わりにthis
を直接使用すればよいです。しかし、ObjBindMethodは、オブジェクトがホットキー、メニューアイテム、GUIコントロールなど、異なるイベントソースによって呼び出されるべき複数のメソッドを持つ場合に便利です。