임계(Critical)

현재 쓰레드가 다른 쓰레드에게 인터럽트 되지 않도록 방지합니다. 또는 인터럽트 되도록 활성화합니다.

Critical [, Off]
Critical 50 ; 아래의 논평을 보십시오.
선택

첫 매개변수가 생략되면 (또는 단어가 On이면), 현재 쓰레드를 임계 값으로 만듭니다. 다른 쓰레드가 인터럽트 할 수 없다는 뜻입니다. 첫 매개변수가 Off이면 (또는 v1.0.48+에서 0이면), 현재 쓰레드는 Thread Interrupt의 설정에 상관이 없이 즉시 인터럽트가 가능해집니다.

임계 쓰레드의 행위

우선순위가-높은 쓰레드와 다르게, 임계 쓰레드 동안 발생하는 이벤트는 폐기되지 않습니다. 예를 들어, 현재 쓰레드가 임계 상태인 동안 사용자가 핫키를 누르면 그 핫키는 현재 쓰레드가 종료하거나 비임계 쓰레드가 될 때 까지 무한정 버퍼 처리되다가, 종료하는 그 순간 그 핫키가 새 쓰레드로 기동됩니다.

임계 쓰레드는 비상 시에만 인터럽트 됩니다. 비상 시란 다음과 같이 구성됩니다:

  1. OnExit 서브루틴;
  2. 0x312 보다 작은 메시지 번호를 관제하는 OnMessage() 함수 (또는 그런 메시지가 촉발한 역호출 함수);
  3. 그리고 임계 쓰레드 자체가 간접적으로 촉발한 역호출 함수 (예, SendMessage 또는 DllCall를 통하여)
이런 인터럽트를 피하려면, 임시로 그런 함수들을 비활성화 시키십시오.

임계 쓰레드는 MsgBox나 기타 대화상자가 화면에 나타나면 인터럽트될 수 있습니다. 그렇지만, Thread Interrupt과 다르게, 이 쓰레드는 사용자가 대화상자를 취소하고 나면 다시 임계 쓰레드가 됩니다.

Critical Off

버퍼 처리된 이벤트가 새로운 쓰레드가 시작되기를 기다리고 있을 때, Critical Off를 사용하면 현재 쓰레드를 즉시 인터럽트하지 않습니다. 대신에, 평균 5 밀리초가 지난 다음 인터럽트가 일어납니다. 이렇게 하면 Critical Off 뒤에 적어도 한 줄이 인터럽트 전에 실행될 확률이 99.999% 이상입니다. 강제로 인터럽트를 즉시 일어나게 할 수 있습니다. 아직 존재하지 않는 창에 대하여 Sleep -1 또는 WinWait와 같은 지연을 사용하면 됩니다.

Critical Off는 현재 쓰레드가 임계 쓰레드가 아니었더라도 그의 인터럽트 불가침성을 취소합니다. 그러므로 GuiSize와 같은 이벤트를 더 빨리 더 예측 가능하게 처리할 수 있습니다.

쓰레드 설정

임계값의 현재 설정을 저장하고 복구하는 법은 A_IsCritical을 참조하십시오. 그렇지만, 임계값은 쓰레드에-종속적인 설정이므로, 임계 쓰레드가 끝나면, 그 아래의/재개된 쓰레드는 (있다면) 자동으로 비임계 쓰레드가 됩니다. 결론적으로 쓰레드를 끝내기 바로 전에 "Critical Off"를 할 필요가 없습니다.

자동 실행 섹션에 (스크립트이 상단 부분) 임계값이 사용되지 않으면, 모든 쓰레드는 비임계 값으로 시작합니다 (그렇지만 Thread Interrupt 설정을 영향을 미칩니다). 대조적으로, 자동-실행 섹션에서 임계값을 켜고 다시 끄지 않으면, 새로 기동하는 매 쓰레드마다 (핫키, 맞춤 메뉴 항목, 또는 시간 제한 서브루틴 등은) 임계값으로 시작합니다.

명령어 Thread NoTimers는 Critical과 비슷하지만 타이머의 인터럽트만 방지한다는 점이 다릅니다.

v1.0.47+에서, Critical을 켜두고 SetBatchLines -1를 배치하면 현재 쓰레드에 영향을 미칩니다.

메시지 점검 간격

v1.0.47+에서, 양의 정수를 첫 매개변수로 지정하면 (예를 들어, Critical 30) 임계값이 켜질 뿐만 아니라 내부 메시지 큐를 점검하는 간격이 수 밀리초로 변경됩니다. 지정하지 않으면, 임계값이 켜져 있는 동안 메시지는 매 16 밀리초마다 점검됩니다. 그리고 꺼져 있으면 매 5초마다 점검됩니다. 점검 간격을 증가시키면 메시지/이벤트의 도착을 지연시킵니다. 그래서 현재 쓰레드는 더 시간을 가지고 종료할 수 있습니다. 이렇게 하면 "이미 실행 중인 쓰레드 때문에" 어떤 OnMessage() 그리고 GUI 이벤트가 소실될 가능성이 줄어듭니다. 그렇지만, SleepWinWait같은 대기 명령어는 이 설정에 관계 없이 메시지를 점검합니다 (우회책은 DllCall("Sleep", Uint, 500)입니다). 주의: 메시지-점검 간격을 너무 많이 늘리면 GUI 창 다시 그리기와 같은 다양한 이벤트에 반응하지 못할 수 있습니다.

관련 항목

Thread (command), Threads, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage(), RegisterCallback(), Hotkey, Menu, SetTimer

예제

#space::  ; Win+Space 핫키.
Critical
ToolTip 이 툴팁이 사라진 후에만 새 쓰레드가 시작합니다.
Sleep 3000
ToolTip  ; 팁을 끕니다.
return  ; 핫키 서브루틴으로부터 반환되면 쓰레드가 종료됩니다. 재개 될 아래의 쓰레드는 정의상 임계값이 아닙니다.
선택 | 내려받기