일반적인 상태 머신구현
• 스위치 케이스문을 이용하여 구현하는 것이 일반적
switch (currentState) {
case ST_IDLE:
// do something in the idle state
break;
case ST_STOP:
// do something in the stop state
break;
// etc...
}
3.
문제점
• 어떤 상태가유요한지, 유효하지 않은지 구분이 어려움
• 상태 사이에서 데이터를 주고받기가 어려움
• 멀티 스레드 환경에 적합하지 않음
4.
어렵게 바꿔서 문제를해결해봄
• 외부 이벤트/ 내부 이벤트 구분
• 이벤트 데이터
• 상태 전이 유효성 검사
• 상태를 함수단위로 묶음
• 상태 맵을 생성
• 전이 맵을 생성
• 세마포 락
5.
외부 이벤트/ 내부이벤트
• 버튼이 눌리는 등 자극이 들어옴
• 현재 상태를 기반으로 전이가 일어남
• 실행이 끝나면 내부 이벤트가 발생했는지 검사함
• 내부 이벤트를 타고타고 계속 실행함
• 모든 과정이 끝나기 전 까진 외부이벤트 영향 x
6.
이벤트 데이터
• 이벤트가생성될 때 데이터를 가지고 갈 수 있음
• 상태 실행이 끝나면 이벤트 데이터는 삭제됨
• new를 통해 힙 영역에 올라가야 함
• 데이터가 많으면 부하가 생길듯..
7.
상태 전이 유효성검사
• 외부 이벤트가 생성되면 검색을 함
• 새로운 상태, 이벤트 무시, 실행될 수 없음 결과가 나옴
• 새로운 상태가 아닐 경우 실행되지 않음
• 이렇게 현재 상태가 valid 한지 검사할 수 있음