작성자 | Azelkeeber | ||
---|---|---|---|
작성일 | 2010-11-16 01:55:34 KST | 조회 | 3,997 |
제목 |
임계 부문을 이용한 대화상자 아이템 이벤트 방지
|
영문으론 Critical Section이라고 불리는 겁니다만
원래는 멀티쓰레드 (다중수행) 시 발생하는 문제를 방지하기 위해 존재하는 기술입니다.
A트리거에서 전역변수 X에 대하여
X = X + 1을 수행하고
B트리거에서 전역변수 X에 대하여
X = X + 1을 동시에 수행했을때
이전 X가 3이면 원래는 5가 되야됩니다만
트리거가 동시에 수행됏을때 둘다 읽는순간 둘다 3이였다면 결과 4가 되버리는 이상현상이 발생합니다.
이걸방지하기위하여
수행이전에 부울 변수에 사용 유무를 기록하여 부울먼저 검사하는 방식입니다.
즉 변수가 사용중인가를 검사하고 사용중일경우 해제될때까지 '대기'하는 항목입니다.
이 기능을 사용하기위해서는 락을 관리할 부울 변수를 전역으로 선언해 줘야합니다.
해당기능을 하단부의 아이템 클릭시 먼저 선언해 줄경우
아래와같은 사용이 가능합니다
전역에 uiLock 부울 선언
UIMainmenuClick
이벤트
대화 상자 - 플레이어 1(이)가 아무 대화 상자 아이템 사용함. 이벤트 유형 클릭됨
지역 변수
조건
행동
일반 - If (조건) then (행동) else (행동)
If
(대화 상자 아이템 이벤트 유형) == 클릭됨
Then
일반 - uiLock(을)를 사용하여 임계 부문 진입
행동
일반 - If (조건) then 다중 (행동)
If Then Else 조건문
일반 - Else if (조건) then (행동)
Else If
(사용된 대화 상자 아이템) == ui_mainmenu_items[0]
Then
R_Utility - sendDebugMsg("TEST1")
R_UI - UIMainmenuHide()
일반 - Else if (조건) then (행동)
Else If
(사용된 대화 상자 아이템) == ui_mainmenu_items[1]
Then
R_Utility - sendDebugMsg("TEST2")
R_UI - UIMainmenuHide()
일반 - Else if (조건) then (행동)
Else If
(사용된 대화 상자 아이템) == ui_mainmenu_items[2]
Then
R_Utility - sendDebugMsg("TEST3")
R_UI - UIMainmenuHide()
일반 - 남은 행동 건너뛰기
Else
즉 임계부분을 진입했을때 추가 작업을 수행하지 못하게 하고 선작업이 완료될때까지 기다리게 됩니다.
머 사실 if로 처리하는거랑 별다를건 없습니다만..
얼마전에 기능찾다가 발견한건데 아래글을 보니
이런식으로 활용할수 잇지 않을까 생각나서 적어봅니다;
|
||
|
© PlayXP Inc. All Rights Reserved.