xojo Rel.2024r3でThreadに新しい機能が追加されました。
ThreadクラスがPreemptive機能をサポートします。
デフォルトではCooperativeですが、IDEで設定を変更する事でPreemptiveに
する事が出来ます。
Preemptive threadsを使うにはいくつか注意点があります。
Preemptiveスレッドを作成するには、Type プロパティを Preemptive に設定します。
実行時にスレッドのタイプを変更できますが、スレッド内のTypeプロパティのみが変更可能です。
実行中の他のスレッドのTypeプロパティを変更しない様に注意が必要です。(してしまうと、クラッシュします)
また、ロック中(セマフォアやクリチカルセッション中)にTypeを切り替えるとクラッシュしたりロック
(フリーズ)します。
デフォルトでは、スレッドはcooperativeであり、全てがアプリと同じCPUコアで実行されリソースも
共有しています。
これは、実行すべき処理が多いほどスレッドが完了するまでに時間が掛かります。
Preemptiveスレッドはアプリ自体とは別のCPUコアで実行する事が出来ます。
そのため、CPUコアに余裕があれば、cooperativeスレッドよりも速く実行できる事です。
Preemptiveスレッドは、スレッド間やアプリとの間でメモリを共有しません。
つまり、スレッド内のコードはアプリの他のオブジェクト等のメモリにアクセス出来ません。
*個人的な見解ですが*、セマフォアやクリチカルセッションを使う事で
ArrayやDictionaryを扱える筈です。
その際はセマフォアやクリチカルセッションのTypeプロパティをPreemptiveにする必要が有ります。
これを忘れるとIllegalLockingExceptionになるようです。
xojoがサポートする機能のいくつかはPreemptiveスレッドから利用出来ません。
(この項目に関して、特定の情報は見つけられなかったです。)
cooperativeスレッドと同様に、UIに直接アクセス出来ません。
Runtime.IterateObjectsメソッドとXojoScriptは、Preemptiveスレッドで安全に使用できません。