Avete mai avuto bisogno di usare metodi con chiamate sia thread-safe che non thread-safe, con condizioni che saltano i comandi che non sono thread-safe? Attualmente il compilatore impedisce di farlo e viene lanciato un errore, ma esiste un flag che consente di disabilitare questo controllo e questo post mostra come fare.
In un metodo chiamante, potreste aver già modificato entrambe le parti del codice: una parte per la modalità preemptive e l’altra per la modalità cooperative. In questo caso, però, il compilatore considera che l’intero metodo non è thread-safe, anche se la parte cooperativa del codice non viene eseguita in modalità preemptive. Neanche i metodi che chiamano questo metodo sono considerati thread-safe!
Cosa fare ora?
Per aiutarvi nella transizione da cooperativo a preemptive, 4D vi permette di disabilitare il controllo di thread-safety del compilatore sui comandi in alcune parti del codice. Per farlo, basta inserire la direttiva del compilatore //%T- prima del codice non thread-safe e //%T+ dopo di esso.
Ecco un esempio considerato thread-safe dal compilatore:
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
Se si eseguono comandi non thread-safe tra le direttive del compilatore //%T- e //%T+ in un processo preemptive, 4D lancia semplicemente un errore.