'예전것/.NET Compact Framework'에 해당되는 글 4건

  1. 2010.01.29 C# : How to Loop PlayList in media player
  2. 2009.11.06 C#에서의 using
  3. 2009.11.04 C# 전역변수 사용법 (폼 간에)
  4. 2009.11.02 About Thread (C#) - .net compact framework
The last portion of code in my previous post actually doesn't give the desired behaviour I don't think. If anyone stumbles across this solution in the future the code for repeating a single file is simpler since we don't need to use the wmppsPlaying event, we can just use wmppsStopped (which is not always the case when playing from a playlist.) The amended code for repeating a single file is attached.

Also as an additional note if you want the media player to loop through an entire playlist (not just repeat one song, which the code above achieves) then you can use;

player.settings.setMode("loop", true);
// If you are playing a single file
private void player_StatusChange(object sender, EventArgs e) {
    if (player.playState == WMPLib.WMPPlayState.wmppsStopped) {
        // simply use the play command to start the track again
        player.Ctlcontrols.play();
    }
}
참조 : http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_23967223.html

'예전것 > .NET Compact Framework' 카테고리의 다른 글

C#에서의 using  (0) 2009.11.06
C# 전역변수 사용법 (폼 간에)  (0) 2009.11.04
About Thread (C#) - .net compact framework  (0) 2009.11.02

c# 에서의 using은 2가지 사용법이 있다.

첫번째는 다들 아시겠지만 네임스페이스사용..
using System;
using System.Collections.Generic;

이런것들에 using이 사용되어 지는 것이고

두번째 사용은 자동  Dispose() 사용시 using문이 사용되어진다.
예를 들어보자
using(testGame = new TestPongGame (testLoop))
{
          testGame.Run();
}
위와 같은 문구가 있을때 { }안에 있는 모든 내용이 완료되어지면 동적으로 생성한 testGame개체에 대한 Dispose()문이 자동으로 불러지게 하는 역활을 using이 하는것이다.

Form1와 Form2를 만들었거든요.

Form1에 값을 Form2에 넘겨서 Form2에 있는 다이얼로그박스에있는 버튼을 누르면 Form1에서 넘겨준

값을 뿌려주는 간단한 프로그램입니다.

 

Form2안에 get,set 코드를 심어주면 잘 되는데.그렇게 하지않구 Data.cs라는 클래스를 하나 만들어서

거기에 get_set을 넣었습니다.어떻게 호출하면 되는지요?

아래와같이 작성했는데 왜 값이 Form2에 안넘어가는지 모르겠네요.

 

/**********Form1.cs***********************/

private void button1_Click(object sender, EventArgs e)
        {          
           
            Form2 Frm2 = new Form2();       
            Data a = new Data();
            a.Ct = "안녕하세요";          
            Frm2.ShowDialog();
         
        }

/***********************************************/

 

/************Form2.cs***************************/

  private void button1_Click(object sender, EventArgs e)
        {
            Data Dt =new Data();          
            MessageBox.Show(Dt.Ct.ToString());
          
        }

 

/************************************************/

 

/************Data.cs*******************************/

class Data
    {
        string caption;
        public string Ct
        {
            get
            {
                return caption;
            }
            set

            {

               caption = value;

            }
        }
    }

 

/***************************************************/

 

왜 그런지 답을 알려드릴게요.

 

/**********Form1.cs***********************/

private void button1_Click(object sender, EventArgs e)
        {          
           
            Form2 Frm2 = new Form2();       
            Data a = new Data();
            a.Ct = "안녕하세요";          
            Frm2.ShowDialog();
         
        }

/***********************************************/

 

Form1 클래스의 button1_Click 이벤트 핸들러에서 하는 작업은 다음과 같네요.

 

1) Form2 클래스의 인스턴스를 생성

 

2) Data 클래스의 인스턴스를 생성 후 초기화 작업

 

3) 생성된 Form2 클래스의 인스턴스를 화면에 출력. ShowDialog() 메소드 사용.

 

 

자~~ 여기서..

 

1) 2) 과정을 보면,

 

Form2 클래스의 인스턴스와

 

Data 클래스의 인스턴스는

 

아무런 연관 관계가 없다는 거죠.

 

관련점을 찾자면, 이벤트 핸들러의 지역 변수로 설정되었다는 거죠.

 

Form2 클래스의 인스턴스는  Data 클래스의 인스턴스의 참조를 갖고 있지 않으므로,

 

여기서 생성된 Data 클래스의 인스턴스에 절대로 접근할 수 없답니다.

 

 

즉, 지역변수로 인스턴스를 생성했든간에, 뭔가 클래스에 참조로 넘겨주든지 하는게 있어야 하는데,

 

그런게 없으니, 클래스의 인스턴스가 무슨 수로 지역 변수에 접근할 수 있겠냐구요?

 

지역변수를 소개시켜주지도 않았으니 알 턱이 없죠.

 

 

****************************************

예를 들어, 최소한 다음과 같은 코드는 있어야 겠죠.

 

            Form2 Frm2 = new Form2();       
            Data a = new Data();
            a.Ct = "안녕하세요";  

 

            frm2.CustomData = a;        // 뭐, 이렇게 설정하는게 있다면야, frm2 에서 CustomData        

                                                     // 프로퍼티로, 데이터를 전달받고 이를 출력할 수 있겠죠.

                                                     // 연관고리가 있어야 한다는 거죠.


            Frm2.ShowDialog();
 

****************************************

 

 

/************Form2.cs***************************/

  private void button1_Click(object sender, EventArgs e)
        {
            Data Dt =new Data();          
            MessageBox.Show(Dt.Ct.ToString());
          
        }

 

/************************************************/

 

 

Form2 클래스의 button1_Click 이벤트 핸들러에서 하는 작업은 다음과 같네요.

 

 

1) Data 클래스의 인스턴스를 생성.

 

2) 이 인스턴스의 내용을 메시지 박스에 출력

 

 

자~~ 여기서..

 

1) 과정에서 생성한 인스턴스는 완전히

 

별도의 메모리 개체로써,

 

Form1 클래스의 이벤트 핸들러에서

 

생성한 Data 개체와는 하나도 관련이 없죠.

 

무슨 말인지 아시겠죠?

 

각각 Form1, Form2 클래스의 이벤트 핸들러에 있는

 

지역 변수일 뿐이란 말입니다.

 

이벤트 핸들러가 끝나면, 그냥 가비지 컬렉터로 이동되는 변수죠.

 

 

 

자~~ 해결책은 여러가지가 있는데, 매우 간단하게 방법을 알려드리죠.

 

Data 클래스를 매개로 Form1 과 Form2 를 연결하고 싶다고 했죠?

 

그러면, Data 클래스를 static 으로 만들어 볼 수도 있어요.

 

클래스를 static 으로 만들었으면, 그 내부에는 멤버도 모두 static 이 되어야 하죠.

 

이렇게 되면, 일종의 전역 변수 형태가 되죠.

 

Form1 클래스에서도 참조가능하고,

 

Form2 클래스에서도 참조가능하죠.

 

static class Data
{
        static string caption;

        static public string Ct
        {
            get
            {
                  return caption;
            }
            set

            {

                 caption = value;

            }
       }
}

 

 

이제, 이벤트 핸들러를 고쳐봅시다.

 

/**********Form1.cs***********************/

private void button1_Click(object sender, EventArgs e)
        {          
           
            Form2 Frm2 = new Form2();       
 

           // Data a = new Data();

           // a.Ct = "안녕하세요";          
          

           Data.Ct = "안녕하세요";
            Frm2.ShowDialog();         
        }

 

/***********************************************/

 

 

/************Form2.cs***************************/

  private void button1_Click(object sender, EventArgs e)
        {
            //Data Dt =new Data();          
            MessageBox.Show(Data.Ct.ToString());
          
        }

 

/************************************************/

'예전것 > .NET Compact Framework' 카테고리의 다른 글

C# : How to Loop PlayList in media player  (0) 2010.01.29
C#에서의 using  (0) 2009.11.06
About Thread (C#) - .net compact framework  (0) 2009.11.02

Application.DoEvent   .. 매니지드 API를 이용한 DoEvents를 모두 처리하는 메소드이다. DoEvents가 호출됐을때, 주 스레드큐에 쌓여 있는 메시지를 모두 처리하는 메소드이다.
DoEvents는 단순한 환경에서는 매우 매력적이다. 특히 코드를 복잡하게하는 스레드의 사용을 피하려는 개발자라면 말이다.
But 매우 위험하다 DoEvents는 메시지큐에 있는 모든 메시지를 처리한 후에 그 다음 코드를 수행하기 때문이다.

윈도우는 매니지드건 네이티브건 컨트롤을 생성한 스레드만이 컨트롤 속성을 변경할 수 있다. (즉, 핸들을 이용한 직접적인 API 호출가능) 다시 말해 윈도우 객체는 스레드 친화성을 가지고있다. 컨트롤의 속성을 읽고 쓰거나 메소드를 호출 하는것도 모두 생성한 스레드 안에서 수행해야 하는것이다. 실질적으로 주 스레드에서만 컨트롤을 터치할 수 있고 작업자 스레드에서는 그렇지 못하다. 그럼 작업자 Invoke(또는 BeginInvoke) 메소드를 호출해서 유저인터페이스를 업데이트 할 수 있다.

Invoke
Invoke 메소드는 전달 받은 대리 함수를 큐에 저장한 후 애플리케이션 메시지큐에 사용자 윈도우 메시지를 보낸다. 메시지가 처리되면서 수행되는 메소드는 내부 함수를 호출 하면서 컨트롤에 이를 알려준다. Thread Method(물론 주 스레드에서 실행되는)의 컨트롤은 내부큐에 존재하는 대리함수 들을 실행한다.


.net framework 에서는 BackgroundWorker 라는 편리한 것을 제공
위는 .net compact framework에 기초한것임

'예전것 > .NET Compact Framework' 카테고리의 다른 글

C# : How to Loop PlayList in media player  (0) 2010.01.29
C#에서의 using  (0) 2009.11.06
C# 전역변수 사용법 (폼 간에)  (0) 2009.11.04