오토핫키 커뮤니티

질문
2015.08.30 08:26

settimer 초기화질문

조회 수 1432 추천 0 댓글 34

특정 프로그램이 종료되는지 일정시간마다 감시하는

settimer을 하나 만들엇는대 settimer은 return을 만나야 초기화가 되는걸로 알고잇습니다

그런데 제 소스는 전부 gusub이나 goto로 연결되어잇어서

settimer에서 종료를 감지해도 제소스쪽으로 보내버릴수가 없습니다.

한번감지를 하고나면 그뒤로는 감지를 하지 못합니다.

그렇다고 return을 해버리면 제소스랑 연결할 방법이없습니다

어떻게 해야될까요


타이머에 종료를 만날시 타이머를 종료시키는 명령어도 넣어봣는대 잘 작동하지 않는것 같습니다 


  • 리체 2015.08.30 11:38

    gosub, goto, settimer의 동작원리에 대해 좀더 정확한 개념정리를 하시고 로직을 파악해보세요.

    해보시고 그래도 파악이 잘 안된다면 소스를 올리세요.

  • 제발등업좀2 2015.08.30 13:55
    종료를 감지 하면 고투 로 제일처음 로직이나.. 재실행 이런곳으로 보내지않나요? 보통? 어떻식으로 연결을 할수없으신지 잘모르겠네요 ..말씀만으로는 이해가 잘 ㅎㅎ
  • T7GG 2015.08.30 14:02
    저도 저부분이 문제 인데요 `-`;;;

    30초 주기로 셋타이머가 작동하며 작동 중지를 인식하면

    셋타이머가 작동하여 정지를 시키든 매크로를 다시 활성화를 시킵니다

    여기서 문제는

    ex)

    라벨:
    행동
    gosub,라벨1
    return

    라벨1:
    행동
    gosub,라벨2
    return

    라벨2:
    행동
    gosub,라벨
    return

    이런방식이기 때문에 return을 만날수 없는 구조입니다..

    결국 셋타이머는 무한루프 걸립니다..

    이부분을 해결해 보고 싶었는데요 `-`;;;

    지식이 짧아 아직 해결 못했네요...

    리체님이 소스 올려 달라고 하셨는데요 아마도...제생각에는 구이와 버튼 빼고 다올려야 될것입니다 ㄷㄷㄷㄷ
  • 제발등업좀2 2015.08.30 15:09
    고쉽라벨은.. 해당행동을 한후 그곳으로 되돌아옵니다..
    왜 되돌아와야하는지요?
    멈춰으면.. 타이머 끄고.. 스크립트 제일처음이나 원하시는곳으로 가면 되고... 멈추 지않았으면 걍 리턴시켜서.. 하던행동 계속하면 되는거 아닌가요??


    셋트 타이머 가 1초 단위로 행동한다가정하에..

    셋트 타이머,가라벨,1000

    가:
    감지행동
    if (판단=감지행동) ;멈춤 정지 그밖에행동
    {
    셋트타이머 off
    고투 , 스크립트원하는곳
    }
    else if (판단=감지행동) ;안멈춤
    {
    리턴
    }
    리턴
    대충 이런방식이여야 하지않나요???
  • T7GG 2015.08.30 15:47
    gosub은 처음 오핫 배울때부터 썻던거라 습관이 된거 같아요 말씀대로 goto로 수정했구요

    아래 알려주신 소스 응용해볼게요 ㅎㅎ

    그리고

    else if 에서
    {
    return << 넣은것과 안넣은것 차이 알 수 있을가요??
    }
    return
  • 제발등업좀2 2015.08.30 16:36
    차이없어요 ㅋ.. 전 주로 펑션으로 만들어쓰기때문에... ㅋㅋ 걍에로 쓴거에요 ㅋㅋ.. ㅎㅎ.. 아래 리체님말씀처럼.. 고쉽을쓰면 반드시 되돌아와야해요.. 고쉽괴 고투는 잘써야해요 그래서 전 펑션을 이용합니다.. 그런 오류를 줄일려구요
  • 리체 2015.08.30 16:02

    gosub ;이 명령은 해당라벨을 수행하고 return을 만나면 돌아와 다음줄로 넘어갑니다.

    여기서 초보자들이 간과하는 아주 중요한점이 있습니다.

    return을 만날때까지 대기한다입니다.

    즉, 스크립트가 종료되기전에는 끝까지 대기하면서 사라지지 않는다는 말입니다.


    자 한번 따져봅시다.
    위와 같은 알고리즘이라면
    gosub, 라벨 ;라벨을 수행하고 return을 만날때까지 대기상태에 들어가게 됩니다. 한데 라벨을 가서 다시
    gosub, 라벨1 ;을 만납니다. 또다시 대기상태에 있는 명령이 하나 더 늘었습니다.
    이런식으로 스크립트가 진행될수록 대기하게 되는 명령이 늘어날것입니다.
    과연 몇개까지 대기가 될까요?
    - 이 부분은 저도 정확히는 모르나 스레드의 갯수(255), 또는 메모리 부족(defalt 64M)

    한계가 오게 되면 스크립트는 무한대기 상태가 되거나 오류가 나게 됩니다.

    예전에 한번 댓글로 설명드린바 있는데, gosub 을 사용할경우 반드시 돌아오게 해야하고
    goto 명령을 사용할 경우(스크립트내에 gosub와 같이 사용할 경우)는 가급적 해당라벨을 넘어서게 하면 안되는 이유가 여기에 있습니다.

  • T7GG 2015.08.30 16:16
    가끔 재시작과 서버끈김을 셋타이머로 잡겠금 해놨는데요

    셋타이머 3개 정도 돌면 먹통되는게..

    저런 변수가 있었네요...goto로 다 고치고 왔습니다 `-`;;
  • 제발등업좀2 2015.08.30 16:41
    상관없는글일지도 모르지만.. 될수있으면 고투 고쉽 지향하시는게 좋아요 ㅎㅎ.. 감시야 셋타이머쓰신다하여도..왠만하면 스크립트에는 안쓰시는게 좋아요 제스크립트도 고투 고쉽 은 거이없어요... 아니아예없다는게 맞겠네요... 쩝 왠만하면 펑션으로 만드시고 그값이나 아니면 펑션 자체를 이용하시는게 훨씬효울적입니다.
  • T7GG 2015.08.30 16:42
    펑션 찾아보고 있어요 +_+
  • 제발등업좀2 2015.08.30 16:38
    역시 설명이 기가막히십니다.. ㅠ.ㅠ 언어표현력이 떨어져서... 뭐라 쉽게 말을 못하겠네요 기초학습 부족이 여기서 ...ㅠㅠ 좋은글 남겨주셨서 감사합니다 리체님...^^
  • 리체 2015.08.30 16:53
    저도 많이 부족한데 쑥스럽게 왜 이러세요. ㅎㅎ;;;
    전 goto는 안쓰지만 gosub은 많이 사용합니다.
    함수로 처리하기엔 많은 변수처리를 해줘야 할 경우는 gosub을 이용하지요.
    제자리로 돌아오게만 구성해주면 아무런 문제가 없고 변수처리를 해야할 필요도 없기 때문입니다.
  • 제발등업좀2 2015.08.30 16:57
    진신을 말씀드린건데 ㅎㅎ.. 전 주로 펑션을 이용해서 처리하기때문에 가끔 변수를 리셋 을 안시켜서.. 몇시간씩 ㅠㅠ헤메고했어요 ㅋㅋ. 멘붕도오고 ㅎㅎ.. 주석을 생활화해야하는데... ㅜ.ㅜ 귀찮으즘이.. 그리 전문적이지도않아서 ㅋ 저번에 알려주신 라이브러리 아주 잘써먹고있습니다 ㅠ.ㅠ 다는아니고 조금이지만 ㄱㅅ 합니다 ^^
  • T7GG 2015.08.30 19:47
    @리체@제발등업좀2
    질문있습니다

    라벨:
    행동
    goto,라벨1
    trturn

    라벨1:
    행동
    return

    goto를 이렇게 쓰고

    gosub, 라벨()
    gosub, 라벨1 ()


    라벨 ()
    {
    행동
    }


    라벨1 ()
    {
    행동
    }

    이렇게 쓰는게 맞나요??
  • 제발등업좀2 2015.08.30 20:47
    라벨 () 이건 펑션아닌가요??

    펑션은.. 어렵게 생각할필요없습니다.. 모바게님 이미지서치 함수가 펑션이에요...

    gosub,라벨 () 이건사용법이 아닐듯한데요?

    펑션 관련 예전에.. 리체님글있어요 참고하시구요

    goto, 라벨1


    이라면..


    라벨1:
    라벨 ()
    라벨1 ()
    return

    이게 맞을듯한데요?
  • T7GG 2015.08.30 20:51
    아하 이해했습니다 +_+
  • 스피릿치 2015.08.30 19:04

    리체님, 제발등업좀2님, t7gg님 좋은말씀 감사드립니다ㅎㅎ

    리체님이 말씀하신거처럼 goto랑 gosub정말 조심해야겟네요 !

    근대 제가 기초지식이 부족해서 펑션이 뭘뜻하는 것인지 모르겟는데

    함수를 말하는건가요?


    그리고 제 소스 올려드릴게요 봐주시면 감사하겠습니다 ㅠㅠ


    raven:
    WinGet, Title , ID, BlueStacks App Player ; 핸들값을 얻어온다
     Gdip_ImageSearchWithHwnd(Title,"image\현재상태\메인레이븐.bmp"X,Y,60)
     ;;메인화면으로 팅긴 경우
      if (x>0)
    {
        gosub, button레이븐실행
        return
    }

       ifwinnotexist,BlueStacks App Player
    {
    ;블루스택이 실행이 안되잇을경우
        gosub, button레이븐실행
        return
    }

    Gdip_ImageSearchWithHwnd(Title,"image\현재상태\하단바.bmp",X,Y,60)
    ;레이븐이 실행이 안되잇을경우
        if (x > 0)
        {

        }
        else
        {

        gosub, button레이븐실행
        return
        }

    return


    button레이븐실행:
    If(FileExist("C:\Program Files\BlueStacks\HD-RunApp.exe"))
    {
    run, C:\Program Files\BlueStacks\HD-RunApp.exe -p com.netmarble.rav -a com.netmarble.rav.RavenUtils
    }
    else
    {
    run, C:\Program Files (x86)\BlueStacks\HD-RunApp.exe -p com.netmarble.rav -a com.netmarble.rav.RavenUtils  
    }
    goto, start
    return


    start>메인찾기>기능 이렇게 넘어가버려서 셋타이머를 제어하기 힘듭니다 ㅠㅠ

    어떻게 해야 될까요..

    button레이븐실행으로 보내버리기전에 셋타이머를 종료시켜도 정상작동 하지 않습니다 ㅠ
     



     

  • T7GG 2015.08.30 19:49
    저랑 거의 비슷한 상황이시네요 ㅎㅎ
  • 리체 2015.08.30 23:13

    블루스택이 실행되지 않았는데 앱을 구동시키는것만으로도 블루스택 구동이 끝난후 앱을 시작시켜요?
    button레이븐실행 라벨에서 goto, start를 사용하셨는데요.
    여기서 goto, start는 없애버리고시고 그냥 리턴하게 만드세요.
    그럼 raven 라벨로 오게 되어 있습니다.
    그리고 첫번째 함수사용에서 X전에 , 가 빠졌습니다.
    그럼 코드를 조금 변형시켜 보죠.

    gosub, raven
    gosub, start
    return

    raven:
    ifwinnotexist,BlueStacks App Player ;블루스택이 실행이 안되잇을경우
    {
    gosub, button블루스택실행
    return
    }
    WinGet, Title , ID, BlueStacks App Player ; 핸들값을 얻어온다.
    ; 만약 블루스택이 구동이 안되어 있는 상태에서 본문(스피릿치님 소스)처럼 맨앞에 기술한다면 그 아래 Gdip 함수는 무용지물이 됩니다.
    Gdip_ImageSearchWithHwnd(Title,"image\현재상태\메인레이븐.bmp",X,Y,60) ;;메인화면으로 팅긴 경우
    if (x > 0) {
    gosub, button레이븐실행
    return
    }
    Gdip_ImageSearchWithHwnd(Title,"image\현재상태\하단바.bmp",X,Y,60) ;레이븐이 실행이 안되잇을경우
    if (x <= 0) {
    gosub, button레이븐실행
    return
    }
    return

    button레이븐실행:
    If (FileExist("C:\Program Files\BlueStacks\HD-RunApp.exe")) {
    run, C:\Program Files\BlueStacks\HD-RunApp.exe -p com.netmarble.rav -a com.netmarble.rav.RavenUtils
    Sleep, 시간
    }
    else {
    run, C:\Program Files (x86)\BlueStacks\HD-RunApp.exe -p com.netmarble.rav -a com.netmarble.rav.RavenUtils
    Sleep, 시간
    }
    return

    button블루스택실행:
    If (FileExist("C:\Program Files\BlueStacks\HD-Start.exe")) ;블루스택 설치가 안되어 있어 실행파일을 정확히 모르겠네요
    run, C:\Program Files\BlueStacks\HD-Start.exe
    else
    run, C:\Program Files (x86)\BlueStacks\HD-Start.exe
    Sleep, 시간

    return

  • 리체 2015.08.30 23:33
    그리고 위의 코드를 Settimer 로 이용한다면 Settimer, off 시키고 return전에 다시 셋타이머를 가동시키면 됩니다.
  • 스피릿치 2015.08.30 23:50
    블루스택이 실행되지 않았는데 앱을 구동시키는것만으로도 블루스택 구동이 끝난후 앱을 시작시켜요?

    에 답변은 예 이고
    start 기능은
    레이븐 앱을 시작시켯을때 공지사항이 뜨는대 공지사항부터 메인화면까지 보내줍니다.
    제가 이해력이 딸려서 위코드가 정확하게 뭘 뜻하는지모르겟네요..
  • 스피릿치 2015.08.30 23:56
    올려주신 소스 다시 차근차근보았는데
    타이머로 올바르게 종료된다고 해도
    start로 넘어가게 할 방법이 생각이나질 않네요..ㅎ
  • 리체 2015.08.31 11:24
    간단합니다. 셋타이머를 어떻게 구성하셨는지는 모르겠지만

    Settimer, 타이머, 60000
    return

    타이머:
    gosub, raven
    gosub, start
    return

    이렇게 기술하면 1분마다 감시하는게 되죠.

    raven이나 start로 넘어가서 참값이 나온다면 Settimer, 타이머, Off 를 첫번째로 적어주고
    return전에 다시 가동하면 됩니다.

    셋타이머는 gosub과 비슷하게 해당라벨을 실행하고 돌아오나 정해진 시간마다 반복되고 본 스크립트와는 별도로 운영됩니다.
    정해진 시간이 되면 본 스크립트 진행사이에 끼어들어 본 스크립트는 일시정지처럼 대기하게 되고 해당라벨을 수행한후 다시 본 스크립트가 진행됩니다.
    여기서 생각해야할 점은 사냥도중 팅겨서 홈화면으로 강제 이동이 된후, 셋타이머가 작동되고 난후 본 스크립트가 다시 진행될때 사냥도중이였으므로 이를 고려해 스크립트를 만들어야 할 것입니다.
  • 스피릿치 2015.08.30 19:55

    @t7gg님

    혹시 실례가 안된다면 같이 도움드리면서 매크로 만들고 싶은데

    네이트온이나 카카오톡으로 대화 할수 있을까요 ㅎㅎ

  • T7GG 2015.08.30 20:29
    제가도움이 안되실거에요 ㅠㅠ일단은 수정해보려고 노력했는데요 아무리 쥐어짜도 좋은생각이 안나가다가요 갑자기생각난 부분이 네불러 매크로인데요 블루스택을 꺼버리면 자동 재시작이되거든요 소스구해서 수정해서 해볼려고했는데요 구할길이 없네요 하하

    일단 매크로 소스 고섭을 다 고투로 고쳤구요 셋타이머를 6개돌리는데요 타이머 안에 타이머오프시켜놨어요
    차이점은 기존 타이머오프없이 쓰면3개발생했을때 과부화 먹통이고요 오프넣으면 3번 발생해도 과부하가 없는것 같아요
  • T7GG 2015.08.30 20:52
    http://tailstar.net/index.php?&mid=autohotkey&search_target=title_content&search_keyword=settimer&document_srl=7904604

    저희가 찾는게 여기있어요 ㅠㅠ
  • 스피릿치 2015.08.30 21:01

    @t7gg

    아항 ㅎㅎ

    reload와 ini를 연동시켜서 사용하면되겟네요 ㅎㅎ

    로그하고 메시지를 저장해서 리로드시 불러오는 방법으로 한번 해볼게요!

    아이디어 제공감사합니다 ㅎㅎ


  • T7GG 2015.08.30 22:04
    구현하시면 저좀 구원해주세요...구현을 못하겠어요..
  • 스피릿치 2015.08.30 22:22
    로그불러오는건 귀찮아서..걍 패스햇고
    전 원래 잇던 자동재시작 체크박스에
    체크되잇으면 시작버튼 누르도록해놓앗고
    에러검출시에 reload시키게 하니 되네요.
  • T7GG 2015.08.31 10:28
    저도 relad 넣어 봤는데요 에러 발생시 리로드 후에 매크로 자체가 서버리던데요 `-`;;;;;

    먼가 다른 방법이 있나요 ??
  • 리체 2015.08.31 10:57
    설정등을 위해서 구이가 끝난후 리턴을 주고 사용자가 시작버튼등을 누르게 했기 때문이겠죠.
    매크로가 시작되면 구이등을 띄우고 설정까지 마친후 시작버튼까지 리턴을 주지 않으면 되고
    또는 별도로 감시하는 매크로를 만들어 주매크로가 리로드나 정지했을경우 시작버튼등을 누르게 하면 됩니다.
  • T7GG 2015.08.31 11:34
    조언 감사합니다 ^ㅡ^ 응용해보겠습니다~
  • T7GG 2015.08.31 12:22
    감사합니다 ㅎㅎ 셋타이머 1개로 무한 재시작을 만들었네요 +_+
  • 모바게 2015.09.01 13:17

    팁이라고 할까.. 제가 settimer 사용하는 방법을 알려드리면..

    기본적으로 프로그램이 돌아가는 메인 루프를 하나만 놔두고...

    settimer로 상태를 체크하는 방법을 사용합니다.

    구분만 잘 한다면 settimer를 여러개 사용해도 이상없이 동작합니다.


    위에 블루스택 실행을 예로 들자면..

    메인:

    loop

    {

      if ( isRunning = 0 )

      {

         블루스택 실행

         sleep, 10000

         continue

      }


      메인 실행..

    }


    타이머:

    if 블루스택 실행중?

      isRunning = 1

    else 

      isRunning = 0


    간단한 예제입니다만.. 실제 체크하는 부분이 많아질 경우, 동작하는 부분이 약간 복잡해지므로..

    내용을 정리해서 프로그램 작성하는 것이 좋습니다^^;;


List of Articles
분류 제목 글쓴이 최근변경 추천
질문 랜덤범위안에서 일정범위 배제하는방법 있을까요?? 2 서시 2015.08.31 0/0
질문 해당함수가 왜 제가 원하는대로 움직이지않을까요 ??ㅇ... 10 닉네이밍 2015.09.01 0/0
질문 settimer 초기화질문 34 스피릿치 2015.09.01 0/0
질문 지금 일하는도중 도움요청해봅니다 5 아델즈 2015.09.12 0/0
자유 혹시 스크립트가 도중에 작동을 멈추는 분 계신가요? 14 sistt 2015.09.01 0/0
질문 자동물약을 한번 만들어 볼려고 합니다. 12 꿈을낚는아이 2020.02.16 0/0
질문 블루스택 이미지 서치후 postmessage 4 부비수달 2015.08.30 0/0
자유 애니팡오토 사례드려요ㅜㅠ 2 higomy 2015.08.28 0/0
질문 opencv 연동이 가능한가요? 4 home01 2015.09.01 1/0
자유 오토핫키 배워보려구요! 4 은하 2016.09.08 0/0
질문 녹스 클릭 관련 postmessege 작동을 안하네요. 뭐가 문... 9 용가리36 2015.08.26 0/0
질문 guicontrol text 변경 및 변수설정, 카운트 5 산적왕입니 2023.07.03 1/0
정보 한/영 전환 및 한글인지 영어인지 체크하는 방법 3 sistt 2017.04.08 1/0
질문 혹시 멀티스레드로 이미지 서치 돌려본 분 계신가요? 1 sistt 2015.09.01 0/0
질문 오토핫키로 이런거 되나요? (초보질문) 6 ddfa4 2015.08.25 0/0
질문 이미지서치 창 설정에 대해 질문 드립니다. 6 백두 2015.09.20 0/0
질문 변수저장하고 +-하는법 질문드려요 5 쉬르릴 2015.08.24 0/0
질문 imagesearch 속도 관련 질문입니다. 17 sistt 2015.09.03 0/0
질문 시간출력질문 3 안녕222 2015.11.19 0/0
자유 안녕하세요 오토핫키 때문에 가입하게 됐습니다 3 뀨뀨꺄꺄 2015.11.19 0/0
Board Pagination Prev 1 ... 147148149150151152153154155 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글