Skript S1 plní objekty typu Užívateľská premenná nasledovne:
- U.Int - celočíselnou hodnotou
- U.Text - textovým vyjadrením hodnoty U.Int
INT _i _i := 1 FillNext: U.Int := _i WAIT U.Text := %IToStr(_i) WAIT _i := _i + 1 GOTO FillNext END
Skript S2 testuje, či je hodnota U.Int správne textovo vyjadrená v užívateľskej premennej U.Text.
INT _i
TestNext:
_i := %StrToI(U.Text)
IF _i # U.Int THEN
MESSAGE "Nie su rovnake" ON WS_BC.HIP
ENDIF
GOTO TestNext
END
Pri takomto usporiadaní dochádza veľmi často ku kolízii. Operácia naplnenia užívateľských premenných U.Int a U.Text
novými hodnotami je prerušovaná skriptom S2, ktorý v nich nachádza nesprávne hodnoty.
Uvedený problém je možné riešiť pomocou akcií GETACCESS a
RELEASEACCESS nasledovne:
Skript S1
INT _i
BOOL _ok
TEXT _regString = "Pristup k U.Int"
_i := 1
FillNext:
_ok := GETACCESS _regString ; zabezpečím si prístup
IF _ok THEN
U.Int := _i
WAIT
U.Text := %IToStr(_i)
WAIT
RELEASEACCESS _regString ; uvoľním prístup
_i := _i + 1
ENDIF
GOTO FillNext
END
Skript S2
INT _i
BOOL _ok
TEXT _regString = "Pristup k U.Int"
TestNext:
_ok := GETACCESS _regString ; zabezpečím si prístup
IF _ok THEN
_i := %StrToI(U.Text)
IF _i # U.Int THEN
MESSAGE "Nie su rovnake" ON WS_BC.HIP
ENDIF
RELEASEACCESS _regString ; uvoľním prístup
ELSE
DELAY 100[ms]
ENDIF
GOTO TestNext
END
Pri takomto usporiadaní skript S2 pristupuje k hodnotám objektov U.Int a U.Text len v prípade, že sa mu podarila registrácia textu akciou GETACCESS. Úspešná registrácia znamená, že skript S1 nemení hodnoty týchto objektov. Ide o konkurenčný prístup dvoch paralelne bežiacich eventov k rovnakým objektom.
Súvisiace stránky:
0 komentárov