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