매크로

조회 수 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
분류 제목 글쓴이 최근변경 추천
자유 히트2는 오토핫키 없을까요 1 매매매핫키 2022.12.07 0/0
자유 히로매크로 사용중입니다. 1 매끄로 2015.03.16 0/0
자유 희한하네요... 2 보득 2015.02.02 0/0
자유 흠냐 오토핫키와 c++ 연관성 34f35 2015.10.09 0/0
자유 흠.. 안녕들 하세요.. 13 폐이니즘 2015.01.16 0/0
자유 흠 gdip 안쓰고도 비활성 이미지 서치가 가능하네요 4 루뽕 2015.11.19 0/0
질문 흑백화를 시킨 후 이미지를 저장 하였습니다. 이후 이... 1 haegu 2018.09.11 0/0
질문 흑백화 이미지서치 참고할만한 글 있나요?? 3 급홍어감별사 2018.07.02 0/0
질문 흑백 비활성 이미지 검색 구현하신 분 계세요? 4 프리 2019.05.23 0/0
자유 후.. 검은거 한번 만들어 볼까 합니다 쟈브 2018.11.14 0/0
질문 후 문의 2번째.. 드립니다......... 4 문의드립니다 2015.06.10 0/0
자유 효율적인 쫄작교체방법이 없을까요? 3 세나블텍 2015.08.06 0/0
질문 활성화된 프로세스 죽이는법 kill 3 리엔니케니스타 2017.03.29 0/0
정보 활성화된 창으로 esc보내는 라이브러리. 1 헐키 2015.06.19 0/0
질문 활성과 비활성의 차이가 무엇인가요~? 1 배고파3000 2018.09.04 0/0
질문 활성 ? 비활성 질문.. 2 아카드 2014.11.04 0/0
자유 확장자 변환기 3 없어돌아가 2015.04.01 0/0
질문 확장모니터에서 controlclick질문드립니다 레나류륜 2016.10.27 0/0
질문 확율을 결과물로 출력중입니다. 특수문자 출력을 못해요 3 가족오락관 2016.11.08 0/0
자유 확실히 오토핫키가... 16 아카드 2014.11.09 0/0
Board Pagination Prev 1 2345678910 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글