Potřebovali jste někdy použít metody s voláními, která jsou i nejsou bezpečná pro vlákna, s podmínkami, které přeskakují příkazy, které nejsou bezpečné pro vlákna? V současné době tomu překladač brání a vyhodí chybu, nicméně existuje příznak, který vám umožní tuto kontrolu vypnout, a tento příspěvek na blogu vám ukáže, jak na to.
V metodě volajícího jste již možná změnili obě části kódu; jednu část pro preemptivní režim a druhou část pro kooperativní režim. V tomto případě však překladač považuje celou metodu za vláknově bezpečnou, i když kooperativní část kódu není prováděna v preemptivním režimu. Ani metody, které tuto metodu volají, nejsou považovány za thread-safe!
Co teď?
Abychom vám s tímto přechodem z kooperativního na preemptivní režim pomohli, umožňuje nyní 4D vypnout kontrolu bezpečnosti vláken překladačem u příkazů v částech kódu. Chcete-li to provést, stačí před kód, který není bezpečný pro vlákna, umístit direktivu kompilátoru //%T- a za ni //%T+.
Zde je ukázka, kterou překladač považuje za bezpečnou pro vlákna:
PROCESS PROPERTIES(Current process;$name;$state;$time;$flags)
$isPreemptive :=($flags?? 1)
If ($isPreemptive)
LOG EVENT (Into Windows log events; "Došlo k chybě xy")
Else
//%T-
DIALOG ("myErrorDialog";New object("message"; "Došlo k chybě xy"))
//%T+
End if
Pokud mezi direktivami //%T- a //%T+ kompilátoru provedete příkazy, které nejsou bezpečné pro vlákna, v preemptivním procesu, 4D jednoduše vyhodí chybu.