블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

GameObject.active = true;

  • StartCoroutine : OK
  • Coroutine Method : OK
  • StopAllCoroutine : OK
  • Invoke : OK
  • InvokeRepeating : OK
  • CancelInvoke : OK


GameObject.active = false;

  • StartCoroutine : Error
  • Coroutine Method : Stop (active 상태에서 돌고 있는 상태였다면 정지된다.)
  • StopAllCoroutine : OK
  • Invoke : OK
  • InvokeRepeating : OK
  • CancelInvoke : OK

** 결론

  • StartCoroutine 으로 코루틴 메소드를 열심히 돌리다가 해당 GameObject 의 active 가 꺼지면 돌던 코루틴 메소드는 정지되고 다시 active 가 켜지더라도 재실행되지 않는다.....
  • 코루틴을 많이 사용하는 로직(Async 로 돌리는 함수들..(WWW, ... 같은...))에서는 꼭 염두해 두어야 한다..
  • OnDisable() {} 에서 관련 처리를 해 주는게 좋다.
  • Invoke 관련은 GameObject 의 active 유무랑 관계없이 돌아간다..


출처 : http://limchaeng.tistory.com/34

반응형

'Unity3D > Script' 카테고리의 다른 글

[펌] Root Motion in Legacy Animation  (0) 2016.03.28
BigNumber  (0) 2016.02.04
임의시간 받아서 시간 표현하기  (0) 2015.10.28
Control ParticleSystem RenderQueue  (0) 2015.09.24
[공유] UnityBoot 프로젝트  (0) 2015.08.30
Posted by blueasa
, |

유니티엔진에서 일반적인 Timer()함수 대신에 MonoBehaviour 가 제공하는Invoke() 함수가 있습니다. 
Invoke(methodName:string, time:float) 
- methodName 메소드를 time 초 후 호출합니다. 

InvokeRepeating(methodName:string, time:float, repeatRate:float) 
- methodName 메소드를 time 초 후 호출합니다. 첫 호출 후 repeatRate 초 마다 반복 호출합니다. 
 InvokeRepeating 는 repeatRate 값이 0 보다 클때만 반복 호출됩니다. repeatRate 값이 0 일때는 최초 한번 호출 후 반복호출되지 않습니다.   ( 출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=50255#c_50287 )


CancelInvoke() 
- 이 스크립트에 있는 모든 Invoke 를 취소합니다. 

CancelInvoke(methodName:string) 
- 이 스크립트에 있는 methodName 을 호출하는 모든 Invoke 를 취소합니다. 



출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=31893&sca=&sfl=wr_subject%7C%7Cwr_content&stx=InvokeRepeating&sop=and&currentId=44



[참조]

http://blog.naver.com/bluefallsky/140190280479

http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.Invoke.html

http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.InvokeRepeating.html

http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.CancelInvoke.html

http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.IsInvoking.html

반응형
Posted by blueasa
, |

유니티엔진에서 일반적인 Timer()함수 대신에

MonoBehaviour 가 제공하는Invoke() 함수가 있다.

 

아래 함수들을 참조할 것

 

Invoke(methodName:string, time:float)
methodName 메소드를 time 초 후 호출합니다.


InvokeRepeating(methodName:string, time:float, repeatRate:float)
methodName 메소드를 time 초 후 호출합니다.
첫 호출 후 repeatRate 초 마다 반복 호출합니다.


CancelInvoke()
이 스크립트에 있는 모든 Invoke 를 취소합니다.
CancelInvoke(methodName:string)
이 스크립트에 있는 methodName 을 호출하는 모든 Invoke 를 취소합니다.

 



출처 : http://blog.naver.com/limik94/20127438317

반응형

'Unity3D' 카테고리의 다른 글

Unity remote 사용방법 (iPhone, Android)  (0) 2012.11.08
Smooth Follow Camera  (0) 2012.11.06
캐릭터 컨트롤 하기  (0) 2012.11.03
빌보드 관련  (0) 2012.11.02
Unity3D로 만드는 초간단 2D 게임 (1)  (0) 2012.11.02
Posted by blueasa
, |

Invoke 를 써서 델리게이트를 간단히 하는 방법이 있다고 한다.

1곳에서만 메인쓰레드의 권한이 필요할경우, 이 방법을 쓰면 좋다고 한다.

만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다고 한다.

 참고 해보길 바란다.

 

이 포스트를 보고있는 여러분들은, 모두 닷넷 프로그래밍에 관심이 있으시고,

현재도 개발툴로 사용중인 분이실 것이다. 쓰레드기반 프로그래밍을 할때(.Net)에서

폼(엄밀히 말하면 윈도우)의 Child컨트롤(요곳도 윈도우)들의 멤버변수들을 조작

하기 위해서는, 메인쓰레드의 권한이 필요하다. 따라서, 메인쓰레드의 권한이 필요

할경우, this.Invoke() 메서드를 쓰게되는데, 이때 이 메서드를 쓰면, 별별놈의

Delegate를 선언해줘야 하고, 또 선언한 델리게이트의 인스턴스를 할당해, 사용

해야해서 코드가 매우 더러워지는것을 느꼈을것이다.

 

예전에 아는 동생녀석의 C#코드를 보고있던 중. this.Invoke()를 아주 이쁘게

잘 써놓은 것을 발견했다. 물론 그놈은.. 예전부터 프로그래밍을 해왔던지라,

모르는 언어도 없고, 시스템 프로그래밍을 가지고 노는애였다.(__)

아무튼 내가 닷넷프로그래밍을 처음배울때, 그놈에게 C#.Net으로된 채팅서버

및 클라이언트 프로그램의 소스를 봐서, Invoke()메서드를 이쁘게 잘쓰는방법을

우연히 터득하게 되었다. 보통의 사람들이라면 Delegate 선언, 인스턴스할당,

Delegate변수명명 까지의 귀찮은 일을 모두 하겠지만, 이 포스트를 봤다면,

이제부터 그렇게 하지말자^^;

 

일단 사용하는 방법은 아주 간단하다. 그냥 this.Invoke()메서드 인자부분에

new MethodInvoker( delegate() { 코드 })를 써주면 끝이다. 이렇게 처리하게

되면, 저런 귀찮은 방법을 사용하지 않고, 그냥 저기안에 코드만 쓰면된다^^;

물론 저렇게 일자로 쓰면, 안이쁘겠지만, 적절히 엔터누질러주시면,

엄청 이쁜코드가 된다. ^^; 동생녀석이 썼던 코드를 보여주겠다.

 

             this.Invoke(new MethodInvoker(
                 delegate()
                 {
                     strCurTime = string.Format("{0:D2}:{1:D2}:{2:D2}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                     string[] strData = new string[3];
                     strData[0] = lstLog.Items.Count.ToString();
                     strData[1] = strCurTime;
                     strData[2] = strTLog;
                     lstLog.Items.Add(new ListViewItem(strData));
                 }
                 )
            );

 

이렇게쓰면, 아주이쁘게 써진다, 또한, Form의 전역공간에 델리게이트를 선언할

필요도 없어져서, 전체적으로 코드가 안정적으로 보인다^^;

저 코드는, 채팅서버에서 로그를 추가하는 델리게이트를 기술하는 것이다^^;

물론 이방법은, 이런 델리게이트가 필요한 곳이 1곳일때만 쓰는것을 추천한다.

만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다.(__)

하지만, 1곳에서만 메인쓰레드의 권한이 필요할경우, 저렇게 하는것이

더 바람직하고, 이쁘다^^;



출처 : http://xmlangel2.blogspot.kr/2009/05/c-%EC%9C%88%ED%8F%BC%EA%B8%B0%EB%B0%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%84-%ED%95%A0%EB%95%8C-invoke-%EC%9D%B4%EC%81%98%EA%B2%8C%EC%93%B0%EA%B8%B0.html

반응형
Posted by blueasa
, |

Invoke, MethodInvoker, BeginInvoke - EndInvoke

 Introduction

  UI Control들은 폼 구동시 실행되는 하나의 쓰레드에서 구동된다. 따라서 사용자가 실행시킨 쓰레드는 별도로 실행 되기 때문에 이 메인 쓰레드에 적절한 마샬링 없이 다른쓰레드에서 직접 접근하면 다른 쓰레드를 침범하는 것이다. (Cross Thread Problem) 이런 경우에는 프로그램이 개발자가 설계한대로 잘 동작하지 않을 수 있다.(Race Condition,DeadLock)  따라서, 안전하게 동작하게 하기위하여 .Net 환경에서는 Invoke를 제공하고 있다.

 본 내용을 무시한 채 프로그램을 작성하면 InvalidOperationException을 발생시키고 . Debug 창에서 "컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다."라는 메세지가 표시 된다. 하지만 디버깅 환경이 아니라면 프로그램은 겉보기에 정상 동작하는 것 처럼 보일 수 있으므로 조심해야 된다. !

 

난 대충 좀 안되도 상관 없다고 생각하시는 분들은 이 예외를 비활성화 할 수도 있습니다.

 

CheckForIllegalCrossThreadCalls 속성 값을 false로 설정하여 이 예외를 비활성화할 수 있습니다. 그러면 컨트롤이 Visual Studio 2003에서와 같은 방식으로 실행됩니다.

 

이 노트에서 학습하실 때 유념하셔야 될 내용은

  1. Control Invoke 와 Delegate Invoke의 차이점을 숙지한다.
  2. Invoke와 BeginInvoke의 차이점과 사용법을 숙지한다.
  3.  

 자 그럼 쓰레드에서 안전하게 Windows Form control을 제어하게 하는 방법에 대해 알아보자.

우선,  InvokerRequired 를 알고 시작하자.  이 속성은 Invoke메쏘드를 호출해야되는 상황인지 알려준다.

 

Invoke

 

 쓰레드에서 폼 컨트롤 하기 위해서는 별도의(SetTextononTextBox1) 메쏘드를 만들어 사용하면 좋다. 예를들어, Textbox에 값을 입력한다면 아래와 같은 'SetTextonTextBox1' 메쏘드를 만들어서 사용하면 Cross thread 환경이든 내부 쓰레드 사용환경에서든 둘다 사용할 수 있다. 또는 Delegate 메쏘드가 FormControl을 인자로 받아서 사용할 수도 있다.

 Invoke를 사용할 때 인자를 넘겨줘야 하는 메쏘드 필요하면 할때는 반드시 delegate를 선언한 후에 사용하여야 한다.

 

  1.         delegate void SetTextCallback(string txt);                    
            private void SetTextonTextBox1(string txt)
            {
                if (this.textBox1.InvokeRequired)
                {
                    this.Invoke(new SetTextCallback(SetTxtCB), new object[] { txt }); //그냥 txt를 넘겨줘도 된다
                }
                else
                {
                    this.textBox1.Text += txt;
                }
            }
            private void SetTxtCB(string txt)
            {
                this.textBox1.Text+=txt;
            }

 

  1.         public delegate void UpdateText(Control ctrl, string text);
            public void UpdateTextFunc(Control ctrl, string text)
            {
                if (ctrl.InvokeRequired)
                {
                    ctrl.Invoke(new UpdateText(UpdateTextFunc), new object[] { ctrl, text });
                }
                else
                    ctrl.Text += text;
            }

 

인자가 없는 메쏘드를 호출할 때는 간단하게 MethodInvoker를 사용하면 좋다.

 

  1.         private void SetTextonTextBox1(string txt)
            {
                if (this.textBox1.InvokeRequired)
                {
  2.                this.Invoke(new MethodInvoker( delegate { this.textBox1.Text+=txt; }) );

                }
                else
                {
                    this.textBox1.Text += txt;
                }
            }

 

BeginInvoke , EndInvoke

 

 우선 BeginInvoke를 설명하기 전에 Windows Form 의 Control.BeginInvoke 메쏘드와 Delegate.BeginInvoke 메쏘드에 대해서 차이점을 설명하고 본 단락에서는 Winfows Form Control의 BeginInvoke만 설명하도록 하겠다.

 Delegate.BeginInvoke는 Asynchronous Delegate를 만들어서 콜백을 하는 것이라고 생각하면 되겠다. 다시말해서, CLR에서 관리하는 쓰레드풀에서 해당 메쏘드를 큐잉한다. 쉽게 얘기해서 별도의 쓰레드를 만들어서 Delegate를 실행한다고 보면 된다.  장점은 IAsyncResult를 이용해서 Object 결과값을 넘겨 받을 수 있다. 보다 자세한 사항은 이곳을 참조!

  Windows Form의 Control.BeginInvoke는 Control 내부 핸들이 작성된 쓰레드(메인쓰레드)에서 지정된 대리자를 비동기식으로 실행한다. 비동기식이므로 실행을 대기하지 않고 BeginInvoke는 즉시 Return 한다.

 차이점을 정리 하자면 Control.BeginInvoke는 실행코드의 GUI Thread에 작성된 코드이고 Delegate.BeginInvoke는 쓰레드풀 쓰레드에 사용된다. 또한 Control.BeginInvoke의 경우는 EndInvoke를 호출하지 않아도 되나 Delegate.BeginInvoke의 경우는 반드시 Delegate.EndInvoke를 호출해줘야 한다 안그러면 메모리 릭이 발생한다.

 

 

  1. public delegate void InvokeDelegate();
  2. private void Invoke_Click(object sender, EventArgs e)
    {
       myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
    }
    public void InvokeMethod()
    {
       myTextBox.Text = "Executed the given delegate";
    }
  3.  

 

 Endinvoke

 Reference
  1. http://msdn.microsoft.com/ko-kr/library/ms171728.aspx
  2. http://xmlangel.textcube.com/6
  3. http://jongkok4.net/entry/펌c-UI-쓰레드-마샬링-Invoke-BeginInvoke?TSSESSIONjongkok4net=6e5ec00b34c31e0126e9a64412f7a627
  4. http://timl.net/2008/01/begininvoke-methodinvoker-and-anonymous.html
  5. http://shiman.wordpress.com/2008/09/10/c-net-delegates-asynchronous-invocation-begininvoke-method/
  6. http://msdn.microsoft.com/ko-kr/library/0b1bf3y3(VS.80).aspx
  7. http://kristofverbiest.blogspot.com/2007/02/don-confuse-controlbegininvoke-with.html
  8. http://www.albahari.com/threading/#_Introduction
  9. http://www.yoda.arachsys.com/csharp/threadstart.html 




반응형
Posted by blueasa
, |