スレッド

現在のスレッドは、最新のイベントによって呼び出された実行フローとして定義されます。例としては、ホットキーSetTimerサブルーチンカスタムメニュー項目GUIイベントなどがあります。現在のスレッドは、自身のサブルーチン内で関数を実行することも、そのサブルーチンから呼び出された他のサブルーチン内で関数を実行することもできる。

AutoHotkeyは実際にはマルチスレッドを使用しませんが、その動作の一部をシミュレートしています:前のスレッドがまだ実行されているときに別のホットキーを押すなどして、2番目のスレッドが開始されると、新しいスレッドが実行できるように、現在のスレッドは中断(一時的に停止)される。2番目のスレッドがまだ実行されている間に3番目のスレッドが開始されると、2番目と1番目のスレッドの両方が休止状態になり、以下同様となる。

現在のスレッドが終了すると、直近に中断されたスレッドが再開され、最終的にすべてのスレッドが終了するまで、これが繰り返される。再開されると、スレッドのSendModeSetKeyDelayなどの設定は、中断される直前の状態に自動的に復元される。言い換えれば、スレッドは中断されたことによる副作用を経験しない(アクティブ・ウィンドウが変更される可能性を除いて)。

注: KeyHistory関数/メニュー項目は、中断状態にあるスレッドの数を示し、ListHotkeys関数/メニュー項目は、どのホットキーにスレッドがあるかを示します。

1つのスクリプトで複数のMsgBoxInputBoxFileSelectDirSelectダイアログを同時に表示することができます。これは、前のスレッドがすでにダイアログを表示している間に、新しいスレッドを(ホットキー時限サブルーチンカスタムメニュー項目などを介して)起動することで達成される。

デフォルトでは、指定したホットキーまたはホットストリングのサブルーチンがすでに実行されている場合、2回目の実行はできません。この動作を変更するには#MaxThreadsPerHotkeyを使います。

関連 Thread関数は、スレッドの優先度や割り込み可能性を設定する。

スレッドの優先順位

現在のスレッドより優先順位の低いスレッド(ホットキー時限サブルーチンカスタムメニュー項目など)は、そのスレッドに割り込むことができない。その間、そのようなタイマーは実行されず、ユーザーが(ホットキーGUIボタンを押すなどして)スレッドを作成しようとしても、何の効果もなく、バッファリングもされない。このため、通常は優先順位の高いスレッドを素早く終了するように設計するか、優先順位を高くする代わりにクリティカルを使用するのが最善である。

デフォルトの優先順位は0である。以下のいずれかの方法で変更しない限り、すべてのスレッドはデフォルトの優先順位を使用する:

OnExitコールバック関数(もしあれば)は、現在のスレッドの優先順位に関係なく、呼ばれれば常に実行される。

スレッドの中断可能性

ほとんどのタイプのイベントでは、現在のスレッドが割り込み可能な場合にのみ、新しいスレッドの起動が許可される。スレッドが中断不可能になるのは、以下のような理由がある:

無停止スレッドの挙動

優先度の高いスレッドとは異なり、スレッドが中断できない間に発生したイベントは破棄されない。たとえば、現在のスレッドが割り込み不可能な状態でユーザーがホットキーを押すと、現在のスレッドが終了するか割り込み可能になるまで、ホットキーは無期限にバッファリングされ、その時点でホットキーは新しいスレッドとして起動されます。

緊急時にはどのスレッドも中断される可能性がある。緊急事態とは

このような中断を避けるには、このような機能を一時的に無効にしてください。

MsgBoxなどのダイアログが表示されると、クリティカル・スレッドが割り込み可能になる。しかし、スレッド割り込みとは異なり、ユーザーがダイアログを解除した後、スレッドは再びクリティカルになる(つまり割り込み不可能になる)。