スレッドセーフなメソッドとスレッドセーフでないメソッドの両方を使用し、スレッドセーフでないコマンドをスキップする条件を使用する必要があったことはありませんか?現在、コンパイラはこのようなことを防ぐためにエラーを投げていますが、このチェックを無効にするフラグがあり、このブログ記事でその方法を説明します。
呼び出し側メソッドでは、プリエンプティブモード用と協調モード用の両方のコードを既に変更している場合があります。しかしこの場合、たとえ協調モードの部分がプリエンプティブモードで実行されていなくても、コンパイラはそのメソッド全体がスレッドセーフでないと見なすのです。このメソッドを呼んでいるメソッドもスレッドセーフとはみなされないのです!
さて、どうする?
このように協調型からプリエンプティブ型への移行を支援するために、4Dでは、コードの一部でコンパイラによるコマンドのスレッドセーフチェックを無効にすることができるようになりました。これを行うには、スレッドセーフでないコードの前に//%T-コンパイラ指令を置き、その後に//%T+を置くだけです。
以下は、コンパイラがスレッドセーフと判断したサンプルです。
PROCESS PROPERTIES
ようなスレッドセーフじゃないコマンドを実行します.
(Current process;$name;$state;$time;$flags)
$isPreemptive :=($flags?? 1)
If ($isPreemptive)
LOG EVENT (Into Windows log events; "Error xy occured")
Else
//%T-DIALOG("myErrorDialog";New object("message"; "Error xy occured"))
//%T+の
End if
プリエンプティブなプロセスで、//%T- と //%T+ コンパイラディレクティブの間でスレッドセーフでないコマンドを実行すると、4D は単にエラーを投げます。