スレッドセーフコマンドと非スレッドセーフコマンドの共存

Deeplからの自動翻訳

スレッドセーフなメソッドとスレッドセーフでないメソッドの両方を使用し、スレッドセーフでないコマンドをスキップする条件を使用する必要があったことはありませんか?現在、コンパイラはこのようなことを防ぐためにエラーを投げていますが、このチェックを無効にするフラグがあり、このブログ記事でその方法を説明します。


呼び出し側メソッドでは、プリエンプティブモード用と協調モード用の両方のコードを既に変更している場合があります。しかしこの場合、たとえ協調モードの部分がプリエンプティブモードで実行されていなくても、コンパイラはそのメソッド全体がスレッドセーフでないと見なすのです。このメソッドを呼んでいるメソッドもスレッドセーフとはみなされないのです!

さて、どうする?

このように協調型からプリエンプティブ型への移行を支援するために、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 は単にエラーを投げます。

Avatar
- プロダクトオーナー - Damien Fuzeauは、2019年2月に4D Productチームに参加しました。プロダクトオーナーとして、ユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換することを担当しています。また、実装された機能が顧客のニーズを満たしているかどうかを確認することも彼の役割です。ナント大学のソフトウェア工学科を卒業。前職の会社では最初は開発者として(1997年に4Dを発見)、後にエンジニアリングマネージャーとソフトウェアアーキテクトとして、23年以上勤務しました。この会社は、4DのOEMパートナーであり、現在は数千のユーザーと数百のサーバーに向けて4Dベースのビジネスソフトを展開しています。ですから、Damienは、多言語環境での4D開発・導入に慣れています。