본문 바로가기

Mobile Develop/WinMoDev Q&A

UI스레드에 접근하는방법과 통신..질문있습니다 ㅜ

질문자 : 라에(asdsa1011)  링크 : http://cafe.naver.com/winmodev/1221
<질문내용>

현재 이미지버튼을 클릭하면 0.1초 주기로 눌렀는지 판별하기 위해서 타이머를 돌리고 있거든요 ;ㅁ;

그런데 그렇게되면 주 스레드가 다른작업을 할 수가없어서

워커스레드를 하나 만들어서 사용하려고 합니다.

스레드를 사용하려고 하는데 몇번 테스트를 해 보았지만

UI스레드에 접근하는 방법을 모르겠습니다 ㅜㅜ..;

 

그리구.. 또 궁금한게 있는데

소켓통신을 하지않고 웹서비스를 통해 채팅을 구현하려고 하는데

웹서비스에 접속하는시간이 오래 걸리기도 하고 (받아오는데 꽤 걸리더군요 시간이..;;)

어떻ㄱ ㅔ 하면 원활하고 빠른 통신을 할 수 있을 지 알고 싶습니다 ㅡㅜ

 

관련소스/참고자료

private void timer1_Tick(object sender, EventArgs e)  //0.1초에 한번씩 실행.

{

     if (CheckBtnClick())
     {
                this.Invalidate();
     }

}

 

private bool CheckBtnClick()
{
      if (btn_send.Click)       //send버튼이 클릭되면
      {
           btn_send.Click = false;      //그림을 바꿔주기위해서 false로 만듬

           /*@@@@@@@@@@@@*/
           return true;    //클릭후 그림을 다시그리기 위해 리턴
       }

return false;     //아무버튼이 눌려지지 않았을 경우 false리턴
}

<답변내용>

안녕하세요 루나네스 입니다

스레드에서는 Control로 직접 접근이 불가능 합니다
Delegate로 접근을 해야 하는데요
예를 들어서

delegate void MethodInvoker(); 로 하나 만들어 주시고

스레드 에서
private void ThreadExample()
{
    while(true)
    {
          ......
          this.Invoke(new MethodInvoker(CheckBtnClick));
          ......
    }
}

이런식으로 선언한 다음 아래처럼 수정이 가능하겠지요

peivate void CheckBtnClick()
{
      if (btn_send.Click)       //send버튼이 클릭되면
      {
           btn_send.Click = false;      //그림을 바꿔주기위해서 false로 만듬

           /*@@@@@@@@@@@@*/
           return true;    //클릭후 그림을 다시그리기 위해 리턴
       }

       return false;     //아무버튼이 눌려지지 않았을 경우 false리턴
}

원래는 Thread에서 직접 UI Control을 건드리지 못하기 때문에
우회해서 접근하는 방법 입니다

C# Delegate 로 검색하시면 많은 자료들이 있으니 참고하세요

그런데.....
왜 이미지 버튼이 눌렸는지 0.1초 주기로 검사를 하시는지 잘 이해가 안되네요 ^^;

추가내용

사용자 정의 컨트롤(user control)로 이미지 버튼을 만들어 보세요
네이버에 (이미지버튼)으로 검색하시면 잘 나와있습니다

간단하게 말씀드리면
user control로 하나 만들고 거기에 OnPaint에서 이미지를 그려주는 방법 입니다

mouse down, up, move 등 이벤트를 이용하면
평상시, 누르고 있을 때, 눌렀을때 반응을 전부 처리가 가능합니다

이벤트로 처리되기 때문에 주 스레드에 영향을 거의 안받는 편 이지요 ^^

 작성일 : 2010.02.08

보다 자세한 정보는 윈도우 폰/모바일 개발자 모임에서 만나보실 수 있습니다