CompareExchangeGlobalVar
Qubes 6.6 Effectue un échange conditionnel atomique de la valeur d'une GlobalVar
Syntaxe
function CompareExchangeGlobalVar(n: String; v: Variant; c: Variant): Variant
Remarques
Cette fonction effectue de manière atomique les opérations suivantes :
- retourne la valeur initiale de la variable globale n
- si cette valeur initiale est égale à c, la fonction écrit v dans la variable globale
NB : Si la variable globale interrogée n'est pas définie, la valeur initiale retournée par la fonction est le variant Unassigned.
Cette fonction est atomique. Cela signifie que si un autre script ou un autre traitement (dans une autre thread du même exécutable) essaie d'interagir avec cette variable globale, il devra attendre que les opérations de cette fonction soient terminées.
Ainsi, ce n'est pas la même chose que de faire appel successivement à ReadGlobalVar et à WriteGlobalVar, car la valeur lue pourrait avoir été changée par un autre traitement avant que l'écriture ait lieu.
Elle permet de mettre en place des verrous légers ou des mécanisme de mises à jour d'états thread-safe.
Voir aussi CompareExchangePrivateVar.
Exemples
var lockName:='MaGlobalVarQuiSertDeVerrou';
var lockOwner:='Description du nouveau traitement qui veut prendre le verrou';
// Récupération du propriétaire actuel du verrou et prise du verrou s'il est disponible
var currentLockOwner:=CompareExchangeGlobalVar(lockName, lockOwner, Unassigned);
if currentLockOwner<>Unassigned then begin
ErrorDlg('La variable est déjà verrouillée par le traitement '+currentLockOwner);
end else begin
try
// Traitements protégés
// par le verrou exclusif
finally
// Libération du verrou, avec alerte si il a été usurpé entre temps
currentLockOwner:=CompareExchangeGlobalVar(lockName, Unassigned, lockOwner);
if currentLockOwner<>lockOwner then
InformationDlg('Attention : le verrou n''a pas été respecté par le traitement '+currentLockOwner);
end;
end;