본문 바로가기

Programming/Tasker 프로필/프로젝트

Perform Task 의 심화된 활용 및 Priority(함수의 활용 및 실행 순서)

[Perform Task의 사용]
 -매개변수 및 반환값
 
Tasker의 기본적인 역할 도 그렇고 대부분의 유틸리티 어플리케이션이나 컴퓨터의 유틸리티 프로그램등의 가장 기본 적인 역할은 '반복' 되는 것을 자동으로 처리하는 것이 아닐까 합니다.
그런데 이 '반복' 되는 것을 자동으로 처리 하기 위해 Tasker로 프로젝트를 만들고, 프로그램을 만들고 하다보면 만드는 과정에서 '반복'되는 작업이 생기기 마련입니다. '반복' 되는 작업을 자동으로 처리하여 조금 더 편하게 사용 하도록 하기 위한 장치를 만드는데 '반복' 되는 작업이 들어가니 참 아이러니 합니다.

그래서 '함수(function 또는 method)' 라는 것이 존재 합니다. Tasker의 용어로 하면 'Perform Task 액션'이 이에 해당 합니다.
Perform task 액션은 말그대로 어떤 task 를 실행 시키는 겁니다. 미리 만들어서 이름을 지정 해 둔 task를 다른 task를 진행하는 중에 실행 시킬 수 있는 것 입니다.

이 때 우리는 현재 진행중인 main task를 부모 task(parent task)라 부르고, 이 부모 task에서 Perform Task 액션으로 수행 시킨 sub task를 자식 task(child task)라 부릅니다.

그렇다면 이 것이 어떻게 '반복'을 줄여 주는가.......
마침 듣고있는 노래중에 김범수의 '보고싶다'가 흘러나오고 있기때문에 이 곡의 가사를 살펴보자면...

 

아무리 기다려도 난 못가
바보처럼 울고 있는 너에 곁에
상처만 주는 나를 왜 모르고...
기다리니 떠나가란 말야.......


보고싶다~~보고 싶다~~........
이런 내가 미워질 만큼~~......
울고 싶다~~내게 무릎 꿇고....
모두 없던 일이 될수 있다면...
미칠듯 사랑했던 기억이 ......
추억들이 너를 찾고 있지만....
더 이상 사랑이란 변명에......
너를 가둘수 없어.............
이러면 안되지만..............
죽을 만큼 보고 싶다..........


보고싶다~~보고 싶다~~........
이런 내가 미워질만큼~~.......
믿고 싶다 오른 길이라고......
너를 위해 떠나야 한다고......
미칠듯 사랑했던 기억이.......
추억들이 너를 찾고 있지만....
더 이상 사랑이란 변명에......
너를 가둘수 없어.............
이러면 안되지만..............
죽을만큼 보고 싶다...........

죽을 만큼 잊고 싶다..........

 
 
이것이 원곡의 가사 입니다.
이 노래에서도 '반복'을 찾아 볼수 있네요.
저는 ctrl + c, ctrl + v를 했지만 이 가사를 처음 적은 사람은
직접 일일이 타이핑을 했겠지요. 만약 이 가사에서 '후렴구' 라는 함수(task)를 만들어서
'Perform Task' 를 적용 했다면 어떻게 될까요?

아무리 기다려도 난 못가
바보처럼 울고 있는 너에 곁에
상처만 주는 나를 왜 모르고...
기다리니 떠나가란 말야.......

perform task - 후렴구()
perform task - 후렴구()

죽을 만큼 잊고 싶다..........

 

 

후렴구() =
보고싶다~~보고 싶다~~........
이런 내가 미워질 만큼~~......
울고 싶다~~내게 무릎 꿇고....
모두 없던 일이 될수 있다면...
미칠듯 사랑했던 기억이 ......
추억들이 너를 찾고 있지만....
더 이상 사랑이란 변명에......
너를 가둘수 없어.............
이러면 안되지만..............
죽을 만큼 보고 싶다..........

 
오!! 무언가 길이가 짧아 진게 보입니다. 직접 타이핑을 할 때도 편하게 되었네요.
'Perform Task'를 활용하니 미리 task를 하나만 작성 해 두면 나중에 같은 작업에는 이를
또 작성 할 필요 없이 두고두고 써먹을 수 있게됐네요...
그런데 무언가 조금 부족한 부분도 있습니다. 원곡 가사를 보면 첫번째 후렴구에서는 3~4번째 줄이

울고 싶다~~내게 무릎 꿇고.... 
모두 없던 일이 될수 있다면...

이고 두번째 후렴구에서는 3~4번째 줄이

믿고 싶다 오른 길이라고......
너를 위해 떠나야 한다고......

로 다른것은 똑같은데 약간 다른단어가 몇개 존재 하네요..... 
하지만 걱정마세요. 우리는 이미 '변수'라는것을 알고 있잖아요.
변수를 활용하여 후렴구를 작성해 봅시다.

 

아무리 기다려도 난 못가
바보처럼 울고 있는 너에 곁에
상처만 주는 나를 왜 모르고...
기다리니 떠나가란 말야.......

perform task - 후렴구(%par1 = 울고 싶다~~내게 무릎 꿇고, %par2 = 모두 없던 일이 될수 있다면)
perform task - 후렴구(%par1 = 믿고 싶다 오른 길이라고, %par2 = 너를 위해 떠나야 한다고)

죽을 만큼 잊고 싶다..........


 

후렴구() =
 
보고싶다~~보고 싶다~~........
이런 내가 미워질 만큼~~......

%par1....
%par2...

미칠듯 사랑했던 기억이 ......
추억들이 너를 찾고 있지만....
더 이상 사랑이란 변명에......
너를 가둘수 없어.............
이러면 안되지만..............
죽을 만큼 보고 싶다..........


 
오오!! 완벽해 졌습니다. 마지막으로 작성 해 본 가사는 원곡과 한치의 오차도 없이 일치합니다!!!!
여기에서 쓰인 %par1 변수와 %par2 변수가 'Perform task' 액션에서 실행 할 task에 넘기는 'Parameter1', 'Parameter2' 에 해당 됩니다.
'Perform task'에서 쓰일 task의 작성 시에는 parameter로 받게 될 부분을 %par1, %par2 지역 변수로 치환해서 작성을 해 두면 되고,
다른 task상에서 'Perform task'를 사용하여 task를 불러 올 때 'Parameter1', 'Parameter2' 부분에 원하는 숫자, 문자, 변수를 넘겨주면 됩니다.

그런데 Perform task 액션에는 Parameter 외에 'Return Value Variable' 이라는 빈칸도 있습니다.
이곳에 변수를 적어 넣으면 그 변수에 자식task에서 구해서 task - Return 액션을 한 값이 들어가게 됩니다.

그렇다면 진짜 Tasker 상에서 Perform task를 사용한 예시를 한번 볼까요?
 



 
 
Sum(자식task)이라는 task를 만들었습니다. 이 task는 Parameter1로 받은 값에 Parameter2로 받은 값을 더하여 더한값을 Return하는 task 입니다.
 
 



 
 
 
그리고 예시(부모task) 라는 task를 만들었습니다. 이task는 'Perform Task'로 Sum을 두번 사용 하는데 한번은 Parameter로 3 과 5, 두번째는 10 과 20을 주었습니다.
그렇다면 이 작업이 끝난 뒤에는 %result1변수에는 8이, %result2변수에는 30이 들어가게 되겠지요?
Flash 액션으로 result1 = %result1  /   result2 = %result2 를 출력하도록 했습니다.
 



 
 
이제 Perform Task의 사용법을 익혔습니다.
 
 
 
 
[Priority에 의한 진행 순서]
 
그런데 한가지 궁금한게 생기지 않나요?
Perform Task 액션에서 수행 되는 task에도(자식 task) 액션이 몇개 존재하고, Perform Task를 수행한 task에도(부모 task) 액션이 몇가지 존재 합니다.
만약 Perform Task를 쓰지 않았다면 task안의 액션이 1부터 순차적으로 실행 될 것이라는 것을 알 수 있습니다.
그런데 Perform Task를 쓴 task(부모 task)에서는 Perform Task 속의 액션(자식 task)이 다 실행 되고 현재 진행중인 task(부모 task)의 액션이 순차로 수행되는 걸까요? 아니면 둘이 동시에 진행 되는 걸까요?
 
이것에 대한 조정은 Perform Task액션의 Priority항목, 메뉴-Preferences-Action-Widget/Shortcut Task Priority, 그리고 프로필에서 쓰이는 task는 
프로필을 꾹눌러서 나오는- Properties-launched Task Priority 에서 하게 됩니다.
 
결론부터 말 하자면 Priority가 높은 것이 먼저 완벽히 수행 되는 것을 보장 받게 되는 겁니다.
Priority가 같다면 동시에 번갈아가며 진행 되는 것입니다.
이 때 Priority가 영향을 미치는 것은 부모 task 와 자식 task 사이에만 입니다.
자식 task와 자식 task 간에는 영향을 미치지 않습니다. 왜 그런가 하면 자식 task는 부모 task에 의해 실행 되어 지기 때문입니다. 위의 스샷에서 부모 task인 '예시' task가 실행되고 1번 액션이 수행 됩니다. 그런데 1번 액션이 자식task를 실행 시키는 액션이기 때문에 부모와 자식의 priority 를 따집니다.
이 때 부모의 priority가 크다면 1번의 자식 task를 아직 진행 하지 않고 부모 task의 2번 액션을 진행 합니다.  이 때 부모 task의 2번 액션도 자식 task를 실행 시키는 액션이기 때문에 부모와 자식의 priority를 따집니다. 이 경우 자식 task 끼리의 Priority를 따질 일이 없습니다.
 
만약 위 예에서 1번 액션 실행 당시 자식 task의 Priority가 컸다면 부모 task는 거기서 멈춰 있고 1번 액션의 자식 task를 먼저 완료 시킵니다. 그러므로 아직 부모task의 2번 액션으로 넘어가지 못하므로 자식 task와 자식 task 간에는 Priority가 영향을 미치지 못하는 겁니다.
 
 
메뉴-Preferences-Action-Widget/Shortcut Task Priority 에서 정한 순위는 바로가기, tasker 위젯으로 실행 시킨 task의 Priority에 해당 됩니다.
 
프로필을 꾹눌러서 나오는-properties-launched priority 에서 정한 순위는 프로필의 어떤 상태 또는 이벤트, 시간에 의해 실행되는 task의 Priority에 해당 됩니다.
 
그리고 실험 결과 task화면에서 오른쪽 밑에 있는 화살표를 눌러 task를 실행 해보는 것은 무조건 9의 Priority를 갖는다는 것을 알게 되었습니다.

 
예를들면 메뉴-Preferences-Action-Widget/Shortcut Task Priority의 Priority는 인데 1번 Perform Task의 Priority와 2번 Perform Task의 Priority가 6 이라면 바로가기 또는 위젯으로 실행 시 부모 task의 순위가 높으므로 1번, 2번을 수행한다 라고 인식은 하지만 아직 그 자식 task를 완벽히 실행 하지는 않고 우선 부모 task를 먼저 실행 하여 3번까지 부모 task의 액션이 모두 끝나면 그때 1, 2번을 수행 하게 됩니다.
이 때문에 같은 task라도 Priority에 따라 결과값이 다를수가 있습니다.
 
 
위에서 든 예에서 메뉴-Preferences-Action-Widget/Shortcut Task Priority의 Priority는 7을 주고, 1번, 2번 Perform Task(자식 task)의 Priority는 6을 줬다면 바로가기, 또는 위젯으로 부모 task인 '예시' task를 실행 시  Falsh 액션으로 뜨는 결과 값이 result1 = %result1 /  result2 = %result2 로 변수 명이 그대로 노출되어 뜨게 됩니다. 자식 task가 아직 수행 되지 않았으므로 %result 변수에 아무 값도 들어가지 않았기 때문입니다.
 



 
 
 
하지만 1번, 2번 Perform Task(자식 task)의 Priority를 8을 준다면 결과가 제대로 나옵니다.

제가 위에서 '실험 결과 task 화면에서 오른쪽 밑에 있는 화살표를 눌러 task를 실행 해보는 것은 무조건 9의 Priority를 갖는다' 는  말을 했었죠? 자식 task의 Priority를 10을 주지 않는 이상 결과가 제대로 출력 되지 않기 때문 입니다.
 
 
 
만약 Priority 관련 한 제 글이 이해가 안되신 다던가 너무 복잡하여 생각 하기 싫다라고 하시는 분은 두가지 팁만 기억 하시면 됩니다.
 
-팁1.
메뉴-Preferences-Action-Widget/Shortcut Task Priority 에서 Priority 값은 되도록이면 낮게 주자.
프로필을 꾹눌러서 나오는-properties-launched priority 에서 Priority 값은 되도록이면 낮게 두자.
(혹은 default 값인 5로 두시는게 무난 합니다.)
 
-이유 : 특별한 경우를 제외한 대부분의 원하는 결과값은 부모 task에 의해 수행되는 자식 task 가 완벽히 수행 된 뒤 나머지 부모 task가 진행 되어야지 나오기 때문입니다. Perform Task를 쓰지 않고 일일히 작성 했다면 당연 히 순차 진행 해야 하는 작업 이기 때문입니다.
 
팁2.
Perform Task로 자식 task를 수행 할 때는 되도록 Priority를 높게(6이상) 주자.
생각 하기 싫다면 그냥 10으로 주자.
 
-이유 : 부모 task 내에 쓰인 자식 task 간에는 영향을 전혀 받지 않으므로 이들이 부모 task 보다 높기만 하면 대부분의 원하는 결과가 나오기 때문입니다.
 
 

 
같이 첨부 된 파일은 이 게시글에 사용 된 Sum 과 예시 task 입니다. import 해 보시면 현재 예시 task의 자식 task로 수행되는 Perform Task인 Sum의 Priority는 10으로 되어 있습니다. 이 때 오른쪽 밑의 화살표를 눌러 수행해보면 정상적으로 결과가 출력 됩니다. 하지만 Priority를 8 이하로 낮추면 결과가 정상적으로 출력 되지 않습니다. 필요하시면 바로가기, 위젯, 프로필을 만들어서 각각 Priority를 설정해서 test 해 보세요^^
 
 
 
[Stop의 영향]
 
Tasker에는 액션으로 어떤 task에서든지 stop을 할 수 있는  'stop 액션'이 존재 하고, Perform Task액션에서 옵션으로 'stop 옵션'을 제공하기도 합니다.
 



 
 
 
그럼 부모 task와 자식 task간의 'stop액션'과 Perform task의 'stop옵션'은 어떤 영향을 미칠까요?
조금 더 정밀 한 실험을 위해 자식 task의 Return액션을 disable하고 Flash 액션을 넣어 보았습니다.
 



 
그리고 'stop 액션'을 넣어 보았습니다. 만약 이 'stop 액션'이 부모 task에 영향을 미친다면 자식 task의 Priority가 부모 task 보다 높을때 자식 task의 실행 이 완료 된 후 'stop액션'이 부모 task까지 멈추게 될 것입니다.
그러나 실험 결과 자식 task의 'stop 액션'은 Prirority에 관계 없이 부모 task에 영향을 주지 않는 다는 결론이 나왔습니다. 자식 task의 Priority가 10, 부모 task의 Priority가 9일 때 자식 task가 진행 되어 Flash - '자식 task 8' 이 먼저 뜨고 부모 task의 flash 구문이 뜨는데 이상이 없었습니다. 그러므로 자식 task의 stop 액션은 부모task에 영향을 미치지 않는다는 것을 알 수 있습니다.
 
그럼 부모 task에 stop 액션이 있을 경우 어떻게 될까요? 부모 task의 마지막에 stop 액션을 넣고 실험을 진행 해 보았습니다.
부모 task 의 Priority가 9, 자식 task의 Priority가 8일때 1번 자식 task까지만 실행 되고 2번 자식 task는 실행이 되지 않습니다.
부모 task의 Priority가 9, 자식 task의 Priority가 10일때는 1번, 2번 자식 task의 실행이 끝나고 부모 task의 실행이 되므로 영향이 없습니다.
그러므로 부모 task에 stop 액션을 넣을 땐 자식 task의 Priority가 부모보다 낮을 경우 문제가 생길 가능 성이 있다는 결론이 생깁니다.(이런 흐름을 의도한 경우는 상관 없습니다.)
 
마지막으로 Perform Task의 'stop옵션' 에 체크를 하면 어떻게 될까요?
결론은 부모 task에 무조건 영향을 준다는 것 입니다. 그 Perform Task가 있는 구문에 도달 했다면 Priority에 상관 없이 무조건 자식 task를 실행 한뒤 바로 전체를 stop해 버립니다. 그러므로 부모 task도 종료 되어 버립니다.
마지막으로 몇가지 테스트를 해보며 알게 된 점은 자식 task를 수정 한뒤에 자식 task만 실행 할때는 상관 없지만 부모 task에서 수정 된 자식 task를 실행 시킬 때는 Tasker를 한번 종료 하여 상태를 저장 해 준 뒤 수행 해야 정상 작동 한다(Scene처럼) 라는 것 입니다.
 
 
그럼 이 글의 결론을 다시 한번 되짚어 정리 해 보자면........
1. Perform Task로 미리 만들어서 이름을 정해 둔 task를 실행 시킬 수 있다.
2. Perform Task액션을 실행한 task는 부모 task, Perform Task로 실행 된 task는 자식 task 라 부른다.
3. Perform Task 액션으로 자식 task에 2개의 매개변수(인자 또는 Parameter)를 전해 줄 수 있다.
(이는 미리 %par1, %par2 지역 변수를 사용한 자식 task가 만들어져 있어야 의미가 있다.)
4. Perform Task액션으로 수행 된 자식 task에서 결과 값을 반환 하게 할 수 있다.
(이는 미리 자식 task에서 Retrun액션을 사용하여 어떤 값이나 변수를 반환 해야 한다.이때는 변수 명은 상관 없다.)
5. Perfrom Task의 Priority옵션은 [자식 task와 부모 task 사이]의 진행 순서에만 영향을 미친다.
 
6. 메뉴-Preferences-Action-Widget/Shortcut Task Priority 에서 Priority 값은 되도록이면 낮게 주자.
프로필을 꾹눌러서 나오는-properties-launched priority 에서 Priority 값은 되도록이면 낮게 두자.
(혹은 default 값인 5로 두시는게 무난)
7. Perform Task로 자식 task를 수행 할 때는 되도록 Priority를 높게(6이상) 주자.
생각 하기 싫다면 그냥 10으로 주자.
8. task화면에서 오른쪽 밑에 있는 화살표를 눌러 task를 실행 하는 부모 task는 무조건 9의 Priority를 갖는다.

9. 자식 task에서 사용한 'stop 액션'은 Prirority에 관계 없이 부모 task에 영향을 주지 않는다. 

 

10. 부모 task에 stop 액션을 넣을 땐 자식 task의 Priority가 부모보다 낮을 경우 문제가 생길 가능 성이 있다.(이런 흐름을 의도한 경우는 상관 없음) 

 

11. Perform Task의 'stop옵션' 에 체크를 하면 부모 task의 진행이 그 Perform Task액션 에 도달 했을 때 Priority에 상관 없이 무조건 자식 task를 실행 한뒤 바로 전체를 stop해버린다.

 

12. 자식 task를 수정 한뒤에 자식 task만 실행 할때는 상관 없지만 부모 task에서 수정 된 자식 task를 실행 시킬 때는 Tasker를 한번 종료 하여 상태를 저장 해 준 뒤 수행 해야 정상 작동 한다(Scene처럼)

 

13. Return 으로 하나의 값말고 여러개의값을 리턴 할 수도 있습니다.

%test1, %test2, %test3 같이 배열식으로 만들어서 %test()로 반환하면 리턴값 = test1,test2,test3식으로 반환이 됩니다. 이를 이용하여 ,로 split 해서 하나씩 사용 할 수도 있습니다.

Sum.tsk.xml


예시.tsk.xml