Haben Sie schon einmal Methoden verwendet, die sowohl thread-sichere als auch nicht thread-sichere Aufrufe haben, mit Bedingungen, die Befehle überspringen, die nicht thread-sicher sind? Derzeit verhindert der Compiler dies und es wird ein Fehler ausgegeben. Es gibt jedoch eine Option, mit der Sie diese Prüfung deaktivieren können, und dieser Blogbeitrag zeigt Ihnen, wie das geht.
In einer Aufrufer-Methode haben Sie möglicherweise bereits beide Teile des Codes geändert; einen Teil für den präemptiven Modus und den anderen Teil für den kooperativen Modus. In diesem Fall geht der Compiler jedoch davon aus, dass die gesamte Methode nicht thread-sicher ist, auch wenn der kooperative Teil des Codes nicht im präemptiven Modus ausgeführt wird. Die Methoden, die diese Methode aufrufen, werden ebenfalls nicht als thread-sicher angesehen!
Was nun?
Um Ihnen den Übergang vom kooperativen zum präemptiven Modus zu erleichtern, können Sie in 4D jetzt die Thread-Safety-Prüfung des Compilers für Befehle in Teilen des Codes deaktivieren. Dazu setzen Sie einfach die Compiler-Direktive //%T- vor nicht thread-sicheren Code und //%T+ dahinter.
Hier ist ein Beispiel, das vom Compiler als thread-sicher eingestuft wird:
PROCESS PROPERTIES(Current process;$name;$state;$time;$flags)
$isPreemptive :=($flags?? 1)
If ($isPreemptive)
LOG EVENT (Into Windows log events; "Fehler xy ist aufgetreten")
Else
//%T-
DIALOG ("myErrorDialog";New object("message"; "Fehler xy ist aufgetreten"))
//%T+
End if
Wenn Sie nicht thread-sichere Befehle zwischen den //%T- und //%T+ Compiler-Direktiven in einem präemptiven Prozess ausführen, gibt 4D einfach einen Fehler aus.