Avez-vous déjà eu besoin d’utiliser des méthodes avec des appels à la fois thread-safe et non thread-safe, avec des conditions qui sautent les commandes qui ne sont pas thread-safe ? Actuellement, le compilateur empêche cette utilisation et une erreur est générée. Cependant, il existe un drapeau qui vous permet de désactiver cette vérification et cet article de blog vous montre comment.
Dans une méthode d’appel, vous avez peut-être déjà modifié les deux parties du code ; une partie pour le mode préemptif et l’autre pour le mode coopératif. Cependant, dans ce cas, le compilateur considère que la méthode entière n’est pas thread-safe, même si la partie coopérative du code n’est pas exécutée en mode préemptif. Les méthodes qui appellent cette méthode ne sont pas non plus considérées comme thread-safe !
Que faire maintenant ?
Pour vous aider à passer du mode coopératif au mode préemptif, 4D vous permet désormais de désactiver la vérification par le compilateur de la sécurité thread des commandes dans certaines parties du code. Pour ce faire, il suffit de placer la directive de compilation //%T- avant le code non thread-safe et //%T+ après.
Voici un exemple qui est considéré comme sûr pour les fils par le compilateur :
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
Si vous exécutez des commandes non thread-safe entre les directives du compilateur //%T- et //%T+ dans un processus préemptif, 4D lance simplement une erreur.