매크로

조회 수 367 추천 0 댓글 3

궁금한게 있어서 질문을 드립니다..


제가 생각하고 있는게 있는데,,,gui로 버튼을 한개 만들고 그 버튼을 한번 누르면 프로그램이 실행하고


한번더 누르면 프로그램이 일시정지나 종료하게끔 만들고 싶어서 검색을 해봤는데


잘 모르겠습니다... 어떻게 접근해야 좋나요..


버튼은 만들었는데 셋타이머로 할려고 해봤는데 검색을 해봐도 버튼 한개로 하는 방법은 못찾았습니다.


혹시 버튼 한개로는 실행과 종료 같이 안되나요??


  • Hangoon 2019.10.22 12:31

    구현하는 굉장히 여러가지 방법이 있습니다


    이를 잘 구현하기 위해서는 

    1. 일단 프로세스가 어떠한 작업을 하는 흐름의 단위인 "스레드" 가 무엇인지 이해하시는것이 필요하고

    2. 그 다음에는 오토핫키가 스레드를 어떻게 다루는지를 이해하셔야 합니다.


    1번은 말그대로 스레드=프로세스의 작업 흐름의 단위 라고 이해를 하시면 됩니다.

    GUI에 A라는 버튼을 만들어서 사용자가 버튼A를 누르면 시간을 카운트하여 GUI에 표기하는 동작을 하는 오토핫키 스크립트가 있다고 합시다.


    그 프로그램을 실행시키면 GUI를 생성하고 버튼을 생성하여 화면에 그려주고 Return을 만나면 대기상태가 됩니다.

    여기까지가 1개의 스레드 흐름입니다. 

    거기서 버튼A를 누르면 시간을 카운트하여 GUI에 표기하는 동작을 반복할겁니다. 이것 또한 버튼A를 누름으로써 발생하는 스레드의 흐름입니다. 


    2번은 조금 어려울 수 있는데요, 오토핫키는 기본적으로 동시에 1개의 스레드만 실행을 할 수 있습니다.

    예를들면 버튼A에 변수C에 숫자를 1초마다 1씩 더하는 동작을 무한 반복하는 기능을 할당하고, 버튼B에는 반대로 변수C에 숫자를 1초마다 1씩 빼는 동작을 무한 반복하는 기능을 할당했을때, 버튼A와 버튼B를 동작을 동시에 사용할 수 없다는 것입니다.

    버튼A를 누르면 변수C에 숫자가 1씩 계속 더해지다가, 버튼B를 누르면 버튼A의 동작(스레드)는 일시정지하고 버튼B의 동작(새로운 스레드)을 수행합니다. 그러다 버튼B의 스크립트(새로운 스레드)를 모두 실행하여 Return을 만나면 다시 버튼A의 동작(스레드)을 멈추었던 지점으로 돌아가서 버튼A 동작(스레드)을 계속 수행합니다.


    원점으로 돌아가서, 버튼A에 1초마다 숫자를 계속 1씩 더해서 GUI에 표기하는 스크립트가 있다고 가정합시다.

    간단하게 Loop를 이용해 작성을 하면 버튼A를 누르면 "무한반복 루프" 에 빠지고 버튼A로 기동되는 스레드는 종료지점이 없기 때문에 프로세스를 종료하지 않는 이상 무한히 수행되는 스레드가 됩니다. 

    이 상태에서 버튼A를 다시 눌러도 버튼A는 작동하지 않습니다. 버튼A로 기동되었던 스레드가 아직 끝나지 않았기 때문입니다.


    하지만 오토핫키에는 사용자 입력 없이 명령어 스스로 스레드를 기동하는 SetTimer라는 명령어가 있고, 반복 스크립트의 경우 Loop가 아닌 SetTimer로 동일한 작업을 수행할 수가 있습니다. 


    즉 버튼A로 유발된 스레드는 SetTimer를 기동한 뒤 Return 명령어로 종료시키고,

    실제 하고 싶은 작업은 SetTimer가 일정 시간마다 자동적으로 실행하도록 코딩을 하는 것입니다.


    이를테면 아래의 코드와 같을 것입니다.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Gui, Add, Text, x100 y15 w200 center vText, 시작 이후 경과 시간 : 0 Sec
    Gui, Add, Button, x150 y30 w100 h40 gButtonStart vButtonStart, 시작
    Gui, Show, w400 h100
    Return
     
    GuiClose:
    ExitApp
     
    ButtonStart:
    GuiControlGet, ButtonStart
    if (ButtonStart="시작")
    {
        GuiControl,, ButtonStart, 종료
        TimeStart:=A_TickCount
        SetTimer, MainScript, 100
    }
    else if (ButtonStart="종료")
    {
        GuiControl,, ButtonStart, 시작
        SetTimer, MainScript, Off
    }
    Return
     
    MainScript:
    Sec := Round((A_TickCount-TimeStart)/1000,0)
    if (Sec != LastSec)
        GuiControl,, Text, % "시작 이후 경과 시간 : " . LastSec:=Sec . " Sec"
    Return
    cs
  • Hangoon 2019.10.22 12:40

    하지만 버튼으로 기동하는 스레드가 간단한 반복작업이 아닌 복잡한 흐름과 분기를 가진 작업이라면 위의 방식보다는 버튼을 따로 만드는게 더 좋을 수 있습니다. 

    메인 작업 스크립트 중간중간에 종료명령을 확인하는 코드를 넣어두고 

    ex)

    if (StopFlag)

    {

    StopFlag:=False

    Exit

    }


    종료 버튼에는 

    StopFlag:=True

    Return

    이라는 간단한 코드만 넣어두면 됩니다


    메인으로 수행 중인 스레드에서는 일정 구간마다 StopFlag를 참인지 체크할 것이고

    메인 스레드 수행 중에도 종료버튼을 누르면 종료버튼의 스레드가 인터럽트하여 StopFlag를 참으로 바꾸고 다시 메인스레드로 복귀하여 기존 작업을 수행하게 됩니다.

    그러다가 메인 스레드에서 StopFlag값을 체크하는 지점을 만나면 StopFlag가 참이 되었기 때문에 여기서 스레드가 종료되어 대기 상태로 돌아가게 됩니다.

  • 나대지마 2019.10.22 21:47

    와..답변 감사합니다..

    지금당장 테스트를 해봐야 겠습니다..


List of Articles
분류 제목 글쓴이 최근변경 추천
질문 else if ~ else 오류나는 이유가 뭘까요 3 바로문 2019.11.08 0/0
질문 옛날 매크로 사용 가능 한가요? 1 북괴군 2019.11.03 0/0
질문 elseif 질문있습니다 바로문 2019.11.01 0/0
자유 핸콕님 오래 활동 하시네요 북괴군 2019.10.31 0/0
질문 오핫 입문자 질문드립니다.. 1 요망한후니 2019.11.04 0/0
질문 차이점궁금해서문의드립니다! 1 스티븐쓰바 2019.10.31 0/0
질문 npc 등 시각 뷰에 따라서 바뀌는 이미지 서치 방법에 ... 1 joeypre 2019.11.09 0/0
질문 두개이미지 틀린점 을 비교 해서 ...고수님들 봐주십... 21 제발등업좀2 2019.10.28 1/0
자유 메이플 매크로 제작 23321312 2019.10.27 0/0
질문 오토핫키 이미지서칭에 들어가는 스크립트 궁금 오토핫키궁금 2019.10.25 0/0
질문 setTimer 질문드립니다 6 우리형 2019.11.04 0/0
질문 오토핫키 접한지 3일된 초보입니다.. 3 나대지마 2019.10.22 0/0
자유 메이플 사냥프로그램찾아요! 1 란슬 2019.11.12 0/0
자유 라이즈 오브 킹덤즈 자동 정찰 매크로 4 Vero 2019.10.21 0/-1
질문 오토핫키는 LD플레이어에 적용되나요 3 달달구리 2019.10.31 0/0
자유 트라하 매크로 프로그램 제작이나 사용료 내고 사용할... 황제를위하여 2019.10.18 0/0
자유 오토핫키처럼 트라하 매크로 프로그램 제작문의 드립니다. 황제를위하여 2019.10.19 0/0
질문 트라하 유료 매크로 구해봅니다. 황제를위하여 2019.10.16 0/0
질문 비활성 PixelColor 관련 질문 오토초바 2019.10.16 0/0
질문 메이플에서 쓰려면 우회를해야하는걸로아는데 2 뚜냔 2020.06.27 0/0
Board Pagination Prev 1 ... 272829303132333435 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글