방개
비밀번호를 잊어버리셨나요?

질문

sleep 이랑 Loop 관련 질문 입니다

    • 글자 크기
F1::

sleep,1000

return


F2::
msgbox,afdsasd

return

 

1. sleep은 스크립트를 멈추는데 멈추는 시간 동안에 핫키를 누르면 명령이 실행돼요 

   스크립트가 멈추면 핫키를 눌러도 반응이 없어야 하는거 아닌가요??

   sleep에 대해 자세히 모르겠습니다 ㅠ

 


F1:: ;첫번째 예시

formattime,time,,m

loop
{
   if time = 0
    {
       exitapp
    }
   msgbox,asdf
   sleep,1000
}
return


F2::   ;두번째 예시

formattime,time,,m

loop
{
   msgbox,asdf
}
return


F3::   ;실시간으로 검사 
loop
{
   if time = 0
      {
          exitapp
      }
}
return



 

2. F3처럼 반복문으로 계속 검사해서 조건이 만족되면 프로그램을 종료하게 하려는데

 

   반복문1 이 실행될 때 핫키로 다른 반복문2 를 누르면 반복문 1이 종료되고 반복문 2가 실행돼요

 

   반복문 두개가 같이 실행되는 방법은 없나요?

 

   

  

    • 글자 크기
댓글 3
  • 2020.3.17 10:00 댓글

    부족한 지식을 공유하는 입장이어서 답변에 망설였는데 공부하는 입장에서 프날님의 추가 답변으로 피드백도 받고 싶은 마음으로 답변드립니다.
    1, 2번 답변이 비슷한데 우선 해당하는 내용의 개념은 '멀티스레드'이고, 관련 내용을 검색해보시면 도움이 될 것 같습니다.

     

    오토핫키 프로그램에서 동시성은 동시에 실행하는것처럼 보이지만 우선순위에 따라서 진행한다고 생각하시면 될 것 같고,
    핫키의 경우 개념적으로 맞는지 모르겠지만 핫키를 입력받으면 기존입력을 무시하고 핫키의 아랫줄부터 코드가 실행하게끔 되어있는 것 같습니다.


    Sleep, 의 경우 ms단위를 갖는 대기시간으로 보시면 될 것 같고, 프로그램이 Sleep, 이라는 행동을 하는 것이고, 멈추는 것과는 다른 것 같습니다.

     

    Loop, 2개를 동시에 동작시키는 기능은 대표적으로 SetTimer를 많이 사용합니다. SetTimer는 지정된 시간마다 해당라벨을 시행하고,
    이를 반복적으로 시행하기 때문에 라벨 내부에는 필요한 내용만 입력하시면 됩니다.
     

    F1::
    SetTimer, 시간체크, 1000 ;시간체크는 라벨 / 1000ms = 1초마다 해당 라벨을 반복해서 실행
    a := 0
    b := 0
    Sleep, 3000
    a := 1
    Sleep, 5000
    MsgBox, %b%
    SetTimer, 시간체크, off ;중요! Off를 통해 종료시켜 줘야 함.
    return
    
    
    시간체크:
    if (a = 1)
    	b := b + 1
    return
    
    
    F4::
    ExitApp

    a = 0인 3초동안은 시간체크를 해도 b가 안더해졌지만 a = 1인 순간부터 5초동안은 b에 1씩 더해져서 MsgBox, 는 5를 출력합니다.

    예제코드가 적절하지는 않은 것 같은데, 이해가 되셨으면 좋겠네요.

  • 2020.3.17 10:21 댓글

    차랑님 말씀이 맞습니다... ^^

     

    근본적으로 오토핫키는 한 번에 한 줄만을 실행시킬 수 있습니다.

    이는 모든 프로그래밍 언어가 그렇지만, 이들 대부분은 이러한 문제를 해결하기 위해 '멀티스레드'개념을 가지고 있습니다.

    즉, 프로그램 두 개를 하나로 묶어서 돌린다고 생각하시면 됩니다. (많이 틀린 설명이긴 하지만요.) 그러면 두 프로그램은 독립적으로 각각의 줄을 실행시킬 수 있습니다.

     

    오토핫키는 멀티스레드를 지원하지 않습니다. 새 서브루틴이 실행되면 우선순위에 의해 동작 여부가 결정되는데, 우선 순위가 같다면(예를 들어서 핫키 서브루틴 작동 중 다른 핫키를 눌렀을 경우) 새로운 서브루틴이 기존 진행하던 서브루틴을 새치기(interrupt)하게 됩니다. 즉, 새로 입력된 서브루틴이 우선 실행됩니다.

     

    이는 오류나 별 다른게 아닌, 오토핫키에서 "두 개의 부분을 동시에 진행해야하는데, 그럴 순 없으므로 새치기(interrupt) 방식으로 동작하게 하자!" 라고 정해둔 것이기 때문에 큰 의문을 안가지셔도 될 듯 합니다.

  • asdf글쓴이
    2020.3.17 10:57 댓글

    와우 여태까지 의문이였던걸 해결했네요

    두분 다 감사드립니다

댓글 달기

서버에 요청 중입니다. 잠시만 기다려 주십시오...