update — 대기 중인 이벤트와 idle 콜백 처리하기
update — 대기 중인 이벤트와 idle 콜백 처리하기
오래 걸리는 계산을 하면서도 화면이나 사용자 입력에 응답하게 만들고 싶을 때가 있어요. 그럴 때 update가 유용해요. 이 명령어가 이벤트 루프에 들어가 대기 중인 이벤트(그리고 idle 콜백)를 처리해주거든요. idletasks 키워드를 주면 동작이 더 세밀해져요.
출처: 문서
본문
문법
update ?idletasks?
이 명령어는 이벤트 루프에 반복적으로 들어가 대기 중인 모든 이벤트( idle 콜백 포함)가 처리될 때까지 애플리케이션을 최신 상태로 만드는 데 쓰여요.
명령어 인자로 idletasks 키워드를 지정하면 새 이벤트나 오류는 처리되지 않고, idle 콜백만 호출돼요. 이로 인해 평소에는 지연되던 작업들, 예를 들어 디스플레이 갱신이나 창 레이아웃 계산 같은 것이 즉시 수행돼요.
update idletasks 명령어는 애플리케이션 상태에 변경이 생겼고, 그 변경을 스크립트가 끝날 때까지 기다리지 않고 화면에 바로 나타내고 싶은 스크립트에서 유용해요. 대부분의 디스플레이 갱신은 idle 콜백으로 수행되므로 update idletasks가 그걸 실행시켜줘요. 다만 창 크기 변경으로 촉발되는 것처럼 이벤트에 응답해서만 일어나는 갱신 종류도 있어서, 그런 갱신은 update idletasks에서는 일어나지 않아요.
옵션 없이 쓰는 update 명령어는 긴 계산을 수행하면서도 애플리케이션이 사용자 상호작용 같은 이벤트에 응답하길 원하는 스크립트에서 유용해요. 가끔 update를 호출하면 다음 update 호출 때 사용자 입력이 처리되거든요.
예제
약 1초 동안 계산을 수행하고 끝내기:
set x 1000
set done 0
after 1000 set done 1
while {!$done} {
# A very silly example!
set x [expr {log($x) ** 2.8}]
# 시간 제한에 걸렸는지 확인. 이 시점에 네트워크 소켓 서빙도,
# Tk 패키지가 로드돼 있으면 사용자 인터페이스 갱신도 기회가 됨.
update
}
더 알아보기
after,interp— 이벤트 스케줄링·인터프리터 관련 명령어- 관련 키워드:
asynchronous I/O,event,flush,handler,idle,update