최근 포스팅에서 WIDGET에서 사용할 수 있는 TIMER EVENT를 소개했는데요. 이번 시간에는 이벤트가 일어나는 순서에 대해서 이야기 해보려고 합니다.
다음 코드는 지난 시간에 사용했던 코드 중에서 다음과 같이 시간을 설정해주는 부분과, 이벤트가 실행되는 부분입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pro auto_5s, event ; 5초의 시간을 설정해주는 부분입니다.. widget_control, event.top, get_uvalue=stash slt_time=5 stash.slt_time=slt_time widget_control, event.top, set_uvalue=stash widget_control, event.top, timer=0 help, event now_time=systime(/utc) mod_now_time=bin_date(now_time) print, 'AUTO DATA LOADING START TIME : ' + strtrim(string(mod_now_time[0]),2) + '년 ' + strtrim(string(mod_now_time[1]),2) + '월 ' + $ time[2]),2) + '일 ' + strtrim(string(mod_now_time[3]),2) + '시 ' + strtrim(string(mod_now_time[4]),2) + '분 ' + $ strtrim(string(mod_now_time[5]),2) + '초' end |
1 2 3 4 5 6 7 8 9 10 |
pro auto_event, event ; 이벤트가 실행되는 부분입니다. widget_control, event.top, get_uvalue=stash IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN now_time=systime(/utc) mod_now_time=bin_date(now_time) print, mod_now_time WIDGET_CONTROL, event.TOP, TIMER=stash.slt_time endif end |
WIDGET_CONTROL, event.TOP, TIMER=stash.slt_time 이라는 부분은, auto_5s라는 프로시저에서 설정된 slt_time에 맞추어 XMANAGER에 의해서 다음 ‘slt_time’초 후에 반복적으로 이벤트를 실행하게 됩니다.
주의할 점은 이 코드가 어디에 삽입되느냐에 따라서 작업에 있어서 중요한, 시간적 정확도에서문제가 생길 수 있다는 점입니다. 현재 사용한 코드에서 WIDGET_CONTROL, event.TOP, TIMER=stash.slt_time 부분은 print, mod_now_time 보다 아래에 위치하고 있는데, IDL은 이 프로그램을 실행할 때 순차적으로 읽어 내려가게 됩니다. 즉, 짧은 시간 내에 실행되는 print 프로시저 대신에, 긴 시간 동안 실행되는 코드가 삽입되어 있을 때는 그만큼 반복되는 시간이 늦춰지게 됩니다. 예를 들어보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 |
pro auto_event, event ; 이벤트가 실행되는 부분입니다. widget_control, event.top, get_uvalue=stash IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN now_time=systime(/utc) mod_now_time=bin_date(now_time) wait, 4 ; 4초동안 멈추게 됩니다. print, mod_now_time WIDGET_CONTROL, event.TOP, TIMER=stash.slt_time endif end |
위 코드는 print 프로시저를 실행하기 전에 4초동안 멈추게 됩니다. 그 이후에 TIMER EVENT를 만나게 되고, slt_time으로 설정된 5초후에 다시 이벤트를 발생하게 됩니다. 그러므로 다음과 같이 9초간격으로 print된 결과가 나타나게 됩니다.
1 2 3 4 5 6 |
AUTO DATA LOADING START TIME : 2014년 9월 22일 1시 54분 23초 2014 9 22 1 54 23 2014 9 22 1 54 32 2014 9 22 1 54 41 2014 9 22 1 54 50 2014 9 22 1 54 59 |
만약에, 5분에 한번씩 작동되어야 하는 프로그램에서 TIMER EVENT코드가 이와 같이 아래에 위치하게 된다면, 시간적으로 정확도가 낮아지게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 |
pro auto_event, event ; 이벤트가 실행되는 부분입니다. widget_control, event.top, get_uvalue=stash IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN WIDGET_CONTROL, event.TOP, TIMER=stash.slt_time now_time=systime(/utc) mod_now_time=bin_date(now_time) wait, 4 ; 4초동안 멈추게 됩니다. print, mod_now_time endif end |
그래서 위와 같이 코드를 수정하게 된다면, 원하는 시간간격과 그 사이에 실행되는 작업간의 갭을 줄일 수 있게 됩니다.
추가적으로 실행하는데 필요한 시간(wait문)과 반복되는 시간의 차이(slt_time)에 대한 비교를 해보면 다음과 같습니다.
실행하는데 필요한 시간 : 4초, 반복되는 시간 : 5초
1 2 3 4 5 6 7 8 9 10 11 |
pro auto_event, event ; 이벤트가 실행되는 부분입니다. widget_control, event.top, get_uvalue=stash IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN WIDGET_CONTROL, event.TOP, TIMER=5 now_time=systime(/utc) mod_now_time=bin_date(now_time) wait, 4 ; 4초동안 멈추게 됩니다. print, mod_now_time endif end |
이 코드는 실행하는데 필요한 시간이 반복되는 시간보다 더 짧으므로, 원하는 시간간격으로 정확하게 실행됩니다. 그래서 다음과 같이 print됩니다.
1 2 3 4 5 6 |
AUTO DATA LOADING START TIME : 2014년 9월 22일 2시 45분 49초 2014 9 22 2 45 49 2014 9 22 2 45 54 2014 9 22 2 45 59 2014 9 22 2 46 4 2014 9 22 2 46 9 |
이 결과와 같이 설정한 반복되는 시간 내에서 데이터를 처리하는 프로그램은 문제가 크게 생기지 않습니다만, 다음과 같이 실행하는데 필요한 시간이 반복되는 시간보다 오래 걸리는 경우에는 또 다른 문제가 생기게 됩니다.
실행하는데 필요한 시간 : 11초, 반복되는 시간 : 5초
1 2 3 4 5 6 7 8 9 10 11 |
Pro auto_event, event ; 이벤트가 실행되는 부분입니다. widget_control, event.top, get_uvalue=stash IF (TAG_NAMES(event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN WIDGET_CONTROL, event.TOP, TIMER=5 now_time=systime(/utc) mod_now_time=bin_date(now_time) wait, 11 ; 11초동안 멈추게 됩니다. print, mod_now_time endif end |
이 코드는 실행하는데 필요한 시간이 반복되는 시간보다 더 오래 걸리게 되고, 다음과 같이 print됩니다.
1 2 3 4 5 6 |
AUTO DATA LOADING START TIME : 2014년 9월 22일 2시 47분 51초 2014 9 22 2 47 51 2014 9 22 2 48 2 2014 9 22 2 48 13 2014 9 22 2 48 24 2014 9 22 2 48 35 |
이 결과와 같이 코드를 실행하는데 필요한 시간이 반복되는 시간보다 긴 경우에는 실행을 하고 있는 도중에, 계속 해서 XMANAGER에서 반복을 주게 되고, 11초간격으로 프로그램이 실행되게 됩니다.
이처럼 원하는 시간 내에서 반복되는 프로그램을 제작할 때는 그 원하는 시간보다 프로그램을 실행하는데 걸리는 시간이 길게 되면 프로그램을 실행하는 시간에서 오차가 생기게 되는 것을 확인할 수 있습니다. 프로그램을 제작할 때 이러한 점을 참고하여 반복되는 시간보다 프로그램이 실행되는 시간이 빠르도록 제작한다면 더 정밀하고 완성된 프로그램을 만들 수 있을 것이라고 생각합니다.