[AS3 , C# ,Serialize]AS3 와 C#의 직렬화 비교

[AS3 , C# ,Serialize]AS3 와 C#의 직렬화 비교



먼저 As3.0( AIR2.0 ) 이다
as.swfcsharp.swf

Created with colorer-take5 library. Type 'csharp'

//c#�� [Serializable] 와 비슷한 개념
[RemoteClass]
public class Test
 {
        private var _str:String = "test";
        public function Test()
        {
            
        }
        
        
        public function get str():String
        {
            return _str;
        }

        public function set str(value:String):void
        {
            _str = value;
        }
}


//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\





            
            //********************
            // as3(AIR2.0 ) code
            //********************
            private function init():void
            {                            
                
                //--------------------
                //  save data
                // 
                // 임시저장 위��는 :
                // C:\Documents and Settings\<내계정>\Application Data\TestSerialize\Local Store
                // ---------------------
                
                
                var t:Test = new Test;
                t.str = "321321321ㅋㅋㅋㅋ";
                //파일을 만들고
                var savefile:File = File.applicationStorageDirectory.resolvePath("data.dat");
                
                //스트림으로 기록 한다.
                var fileStream:FileStream = new FileStream();
                fileStream.open(savefile , FileMode.WRITE);
                fileStream.writeObject(t);
                fileStream.close();
                t= null;
                
                
                
                
                
                // ----------------
                // load data
                // ------------------ 
                
                //파일위��를 참고��고
                var loadfile:File = File.applicationStorageDirectory.resolvePath("data.dat");
                //존재여부를 판단��여,
                if(loadfile.exists){
                    var _t:Test;
                    var fileStrem:FileStream = new FileStream();
                    //읽고, 
                    fileStream.open(loadfile , FileMode.READ);
                    //타입캐스팅 한다
                    _t = fileStream.readObject() as Test;
                    
                    trace(_t.str);
                }
            }
 
 
 
 
 
 
 
 
 
 
 
그다음은 c# (3.0)
 
 
 
 
 
 
 

 
 
 
 
 
 
Created with colorer-take5 library. Type 'csharp'

// ****************
// c#(3.0) code
// *****************

using System;
using System.Collections.Generic;
using System.Text;
//* 추가된 네임스��이스 **//
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    //as3�� [RemoteClass] 와 비슷한개념 //
    [Serializable]
    
    class TestSerilize
    {
        private string str = "test string";
        public String STR
        {
            get{ return str; }
            set { str = value; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {

            //------------
            // save data
            //------------

            TestSerilize s = new TestSerilize();
            s.STR = "!@!@!zz,zㅋㅋㅋㅋ";
            // 파일을 만들고
            Stream saveFile = new FileStream("data.dat", FileMode.Create, FileAccess.Write , FileShare.None);
            BinaryFormatter bf_save = new BinaryFormatter();
            // 바이너리로 쓴다.
            bf_save.Serialize(saveFile, s);
            saveFile.Close();
            s = null;

            


            //---------
            // loadData
            //-----------
            
            try
            {
                //파일을 읽고,
                Stream loadFile = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
                BinaryFormatter bf_load = new BinaryFormatter();
                //바이너리를 읽는다
                TestSerilize _s = (TestSerilize)bf_load.Deserialize(loadFile);
                loadFile.Close();
                Console.WriteLine("deSirialize " + _s.STR);
            }
            catch (IOException e)
            {
                //��시�� ��는,  에러를 ��리한다.
                Console.WriteLine("파일이 없거��..");
            }
        }
    }
}
 
 
 
비슷 하다. 하지만 as3 에서 파일경로를 프로젝트 위치로 하면 보안오류가 발생한다.

(아마 둘의 직렬화 파일을 바꿔치기 하면,, 안되겠지. ㅋ )
Yamecoder 야매코더_
C# 2010.12.04 03:53

[c# TCP socket] Clinet가 죽은것을 알아채기


<TCP 서버 에서 TCP클라이언트를 이용하는 상황에서..>

TcpClient 클래스 속성중 Connected  라는 속성이 있다. 말그대로 클라이언트가 살았는지 죽었는지

판단하는 속성인데 서버에서 잘 작동하지 않는다. ( 나만 잘 모르는 것일수도 있다.)

그리고 통상적으로 while 루프 안에 스트림을 읽어 오는 코드를 작성한다음

클라이언트 프로그램이 종료 되는경우를 TcpClient 클래스 속성중 Connected  를 이용하면

무한 루프에 빠진다.

해결책은 클라이언트로 오는 바이트 수가 "0" 인것을 확인하여 처리를 해주면 된다.



             while(true)
            {
                /***중요***/
                reciveByte = new byte[1024];
            
                data = reader.ReadLine();
                if(data == null)
                {
                    Invoke(mrg , "클라이언트가 죽었습니다");
                    AceptClient();
                    break;
                }
                
                
                /*** 중요 ***/
                else if(stream.Read(reciveByte , 0 , reciveByte.Length) == 0)
                {
                    Trace.WriteLine("EXIT");
                    AceptClient();
                    break;
                }
            }
/*** 중요 ***/ 라고 되어 있는 부분을 보면 된다.

byte[] 를 하나 만들어  Stream 의 Read 속성을 적용 시켜 주면 된다.

만약 공백이라면 "1" 바이트 를, 값이 날라오지 않는 경우라면 "0"  을 반환 함으로 Client가 죽었는것을 알수 있다.

추가로 첫번째 예외처리는 서버app 를 종료할때 생기는 에러를 대처하기 위함이다.

순간적으로 data 가 Null 값이 됨으로 while 를 탈출하게 해논것이다.
 
 
 
파일 전송중 클라이언트 사망을 눈치 채기 (2012,02,12)
http://scripter.co.kr/203

Yamecoder 야매코더_
C# 2010.12.04 03:51

[Simple Text Writer V0.1] 간편한 파일 쓰기 어플


간편한 파일 쓰기 어플



client code (AS3)

flush 규칙!


         파일경로(filePath):::내용(content) + "\n"

(':::' 요걸로 파일경로와 내용을 구분합니다.)


ex >> "c:\\sampleFolder\\childFolder\\content.xml"
         +":::
         +xml.toString()
         +"\n";


그냥 자기 컴퓨터에서 돌아가는 로컬용 입니다.(웹은 당연 안돌아가겠죠)
대용량은 테스트 안해봤습니다.
하루 종일 돌려보진 않았습니다.
피드백은 덧글로..
버전업은 할수 있을지. ,, 과연 = =;
옵션도 넣고 하려 했지만.. 일을 줄이기 위해 만드는건데, 이게 더 일이 될것 같아서 딱 필요한것만 구현했습니다.
Yamecoder 야매코더_
C# 2010.12.04 02:35

[WinForm] Graphic을 PictureBox에 넣어보자!


픽처박스에 이미지를 바로 넣으면 좌표와 크기 조절등에서 제약이 생긴다.

그래서 그래픽을 사용하였다. 그리리고 문제는 그림이 윗창에 가리거나 최소화 되는경우

그림이 지워지는 경우가 발생하였다. ( 당연한 경우지만.. )


그래서 알아본결과

http://www.techotopia.com/index.php/Drawing_Graphics_in_C_Sharp

처럼 Graphic을 사용할시 Paint 이벤트를 사용해 변경이 있을때 마다 매번 다시 그려 줘야 한다고 한다.

그러나 Paint 이벤트를 사용한다면 고속처리가 어렵다.

그래서 픽처박스의 고속 이미지 처리와 Graphic을 사용하여 위치와 크기 조절을 할수 있는방법을

알아보겠다 ( 왜... 구글링해도 안나올까? )

Created with colorer-take5 library. Type 'csharp'

//그��픽 ����와..
            Graphics g;

            //비트맵 ����를 준비한다
            Bitmap canvas;

            //비트맵을 할당��고 크기를 정한다 (물론 여러 ����을 사용해도됨)
            canvas = new Bitmap(1024, 768);

            //픽쳐박스�� 이미지에 비트맵을 참조한다
            pictureBox1.Image = canvas;
            //크기도 맞출라면 맞추고,,
            pictureBox1.Size = canvas.Size;

            //그��픽을 비트맵으로 부터 가져��다
            g = Graphics.FromImage(canvas);

            //그��픽에 원��는 모양을 그린다
            g.DrawImage(Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"), 
                new Rectangle(0,0,canvas.Width,canvas.Height));
            g.DrawRectangle(new Pen(Brushes.Black), new Rectangle(10, 10, 50, 50));
 
 
 
 























확실히 창을 최소화 했다가 최대화 해본다던지 그림부분을 화면 밖으로 드래그하여 보내본다던지

해보면 이벤트를 받아 매번 다시그려주는 방법보다 월등히 빠른속도를 볼수 있다.

또한 하나의 컨테이너에 여러가지 그림을 그릴수 있다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • hika 2010/09/23 11:42 #

    gdi repaint는 고전중에 고전이지.
    너무 고전이라 검색해도 안나오는 거겠지.
  • superSC 2010/09/26 00:28 #

    ㅎㅎ ; 그 고전이 중요했습니다 ㅋ

  •  
    Yamecoder 야매코더_
    C# 2010.12.04 02:33

    [Sharp Developer , XNA3.1] SharpDeveloper 의 Empty 프로젝트에 XNA 사용하기








    새 솔루션에서 Empty 프로젝트를 생성




    참조 추가에 xna 를 찾아준다.




    기본적인 Game1.cs 코딩을 해준다.


    시작점을 잡아주고...



    디버깅
    성공...



    오늘도 잡기술만 늘어가고........
    Yamecoder 야매코더_
    C# 2010.12.04 02:31

    [XNA , Texture2D] Texture2D from Bitmap (very Simple)


    Content.Load<T> 로 불러올수 있는것은 *.xnb밖에 없다.

    동적으로 캡춰되거나 연산된 비트맵을 받아오기가 영 까다롭다.

    그래서 매우 간단한 비트맵 복사 방법을 생각했다.


    Created with colorer-take5 library. Type 'csharp'
    
    private Texture2D tx;
            protected override void LoadContent()
            {
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                //비트맵을 만든다.
                Bitmap b = new Bitmap(@"c:\a.jpg");
                //xna �� 컬러배열을 타겟 비트맵 크기만큼 생성한다.
                xColor[] pixels = new xColor[b.Width * b.Height];
                //x , y 루프를 돌려 비트맵�� 컬러를 검출��여 xna 컬러배열에 넣는다.
                for (int y = 0; y < b.Height; ++y)
                    for (int x = 0; x < b.Width; ++x)
                    {
                        cColor c = b.GetPixel(x, y);
                        pixels[(y * b.Width) + x] = new xColor(c.R, c.G, c.B, c.A);
                    }
                //texture2d를 생성��고 컬러를 적용한다.
                tx = new Texture2D(graphics.GraphicsDevice, b.Width, b.Height, 1, TextureUsage.None, SurfaceFormat.Color);
                tx.SetData<xColor>(pixels);
    
    
            }
    
    실시간으로 캡춰가 될때 퍼포먼스는 아직 무리수
     
     
    Yamecoder 야매코더_
    XNA 2010.12.04 02:28

    [c#][Aforge] 웹캠 영상출력



    http://www.codeproject.com/KB/game/VidTextureClassWebcamApp.aspx?msg=2630927
    는 속도도 그렇고., 품질이 조금 아닌듯 하여..

    Aforge 로 캠영상을 받아서 픽셀을 실시간으로 Texture2D로 카피하는 계획을 세웠다.

    우선 Aforge.net 으로 매우 간단한 캠 영상받기


    Created with colorer-take5 library. Type 'csharp'
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using AForge.Video.DirectShow;
    using AForge.Controls;
    
    namespace AforgeTest
    {
        public partial class Form1 : Form
        {
            // 크기설정
            int _wid = 640;
            int _hei = 480;
    
    
            VideoSourcePlayer player;
            public Form1()
            {
                setPlayer();
                InitializeComponent();
    
                this.ClientSize = new System.Drawing.Size(_wid, _hei);
                this.Load += new EventHandler(Form1_Load);
                this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
            }
    
            //플레이어 셋팅
            void setPlayer()
            {
                player = new VideoSourcePlayer();
                player.Width = _wid;
                player.Height = _hei;
                this.Controls.Add(player);
            }
    
            //초기화
            void Form1_Load(object sender, EventArgs e)
            {
                //디바이스�� 설정
                FilterInfoCollection device = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                //카메라�� 설정 :: 디바이스�� 0 번째를 가져��다( 카메라가 하나일경우 )
                VideoCaptureDevice cam = new VideoCaptureDevice(device[0].MonikerString);
                //카메라�� fps 설정 :: 안해도 됨
                //cam.DesiredFrameRate = 30;
    
                //플레이어에 적용 / 시작
                player.VideoSource = cam;
                player.Start();
            }
    
            //종료
            void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                player.SignalToStop();
                player.WaitForStop();
            }
    
        }
    }
    





    Aforge : http://code.google.com/p/aforge/
                http://www.aforgenet.com/

    참고 : http://stackoverflow.com/questions/1789684/webcam-calling-in-xna




    추가 :: avi 불러오기
    다음과 같이 초기화 하면 된다.


                FileVideoSource video = new FileVideoSource(@"G:\Down\movie.avi");
                player.VideoSource = video;
                player.Start();





    속도가... 빠르다..
     

     
    Yamecoder 야매코더_
    tags : Aforge, csharp, XNA
    C# 2010.12.04 02:27

    [BackGroundWorkerTEST] Sync , Async , Thread





    주요 Code




    MSDN
    http://msdn.microsoft.com/ko-kr/library/system.componentmodel.backgroundworker(v=VS.90).aspx?appId=Dev10IDEF1&l=KO-KR&k=k(EHINVALIDOPERATION.WINFORMS.ILLEGALCROSSTHREADCALL);k(TargetFrameworkMoniker-".NETFRAMEWORK&k=VERSION=V3.5");k(DevLang-CSHARP)&rd=true




    Created with colorer-take5 library. Type 'csharp'
    
    //sync
            private void testCodeSync()
            {
                using (System.Net.WebClient wc = new System.Net.WebClient())
                {
                    wc.DownloadFile(streamPath, "test_"+checkTime.ToString()+currentState+".tmp");
                }
                stateTx.Text = currentState + " :: done";
            }
    
    
            //async
            private void testCodeAsync()
            {
                using (System.Net.WebClient wc = new System.Net.WebClient())
                {
                    wc.DownloadFileAsync(streamPath, "test_" + checkTime.ToString() + currentState + ".tmp");
                }
                stateTx.Text = currentState + " :: done";
            }
            
    
            
            //################
            //backgroundworker
            BackgroundWorker bw = new BackgroundWorker();
            void BGWorker()
            {
                //bw = new BackgroundWorker();
                bw.RunWorkerAsync();
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            }
            
    
            void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //RunWorkerCompleted 이벤트 안에서는 윈폼 스레드로 돌아와 안전��게 컨트롤 할�� 있다.
                stateTx.Text = currentState + " :: done";
                bw.Dispose();
            }
    
            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                using (System.Net.WebClient wc = new System.Net.WebClient())
                {
                    wc.DownloadFile(streamPath, "test_" + checkTime.ToString() + currentState + ".tmp");
                }
                //에러! : 크로스 스레딩 ( 스레드가 다르다 )
                //stateTx.Text = currentState + " :: done";
            }
    
    인터넷 속도가 빠를경우 테스트가 잘 되지 않지만 Async 도 처음에 실행할때는 약간의 딜레이가 생긴다
    sync 는 항상 딜레이가 생긴다.
    테스트 타겟은 구글의 메인페이지 이다.
    Yamecoder 야매코더_
    C# 2010.12.04 02:26

    [user32.dll] 강제 마우스 컨트롤 ( user32.dll spec )


    스트레스 테스트에 활용할법한..







    Created with colorer-take5 library. Type 'csharp'
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    namespace AutoMouseTest
    {
        
        public partial class AutoMouseCursor : Form
        {
    
            //user32.dll 에서 필요한 메서드를 가져��다   :: using System.Runtime.InteropServices; 사용
            [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
            internal extern static Int32 SetCursorPos(Int32 x, Int32 y);
            [DllImport("user32.dll", EntryPoint = "mouse_event")]
            internal extern static Int32 mouse_event(uint dwFlags , int dx , int dy , int cButtons , int dwExtraInfo);
    
    
            public AutoMouseCursor()
            {
                InitializeComponent();
                xposTx.Text = "0";
                yposTx.Text = "0";
    
                rbt.CheckStateChanged += new EventHandler(CheckStateChanged);
                lbt.CheckStateChanged += new EventHandler(CheckStateChanged);
    
                linkLabel1.Click += delegate(object sender, EventArgs e) { Console.WriteLine("line"); Process.Start("http://scripter.egloos.com/2539538"); };
            }
    
            //체크박스 제어
            void CheckStateChanged(object sender, EventArgs e)
            {
                CheckBox target = sender as CheckBox;
                if (target.CheckState == CheckState.Checked)
                {
                    if (target.Name == "rbt")
                        lbt.CheckState = CheckState.Indeterminate;
                    if (target.Name == "lbt")
                        rbt.CheckState = CheckState.Indeterminate;
                }
                
                if (target.CheckState == CheckState.Unchecked)
                {
                    if (target.Name == "rbt")
                        lbt.CheckState = CheckState.Unchecked;
                    if (target.Name == "lbt")
                        rbt.CheckState = CheckState.Unchecked;
                }
            }
    
            //실행
            private void move_Click(object sender, EventArgs e)
            {
                //포지��을 가져��
                int xpos = 0;
                int ypos = 0;
                Int32.TryParse(xposTx.Text,out xpos);
                Int32.TryParse(yposTx.Text, out ypos);
                
                //이동
                SetCursorPos(xpos, ypos);
    
                //버튼 클릭
                if (rbt.Checked)
                    mouse_event((int)MouseFlags.RIGHTCLICK, xpos, ypos, 0, 0);
                if (lbt.Checked)
                    mouse_event((int)MouseFlags.LEFTCLICK, xpos, ypos, 0, 0);
    
                this.Text = this.Text + "  x:" + xpos +" y:" + ypos; 
            }
    
    
            // mouseFlasg 상��
            public enum MouseFlags
            {
                LEFTDOWN      = 0x00000002,
                LEFTUP        = 0x00000004,
                LEFTCLICK     = 0x203,
                MIDDLEDOWN    = 0x00000020,
                MIDDLEUP      = 0x00000040,
                MOVE          = 0x00000001,
                ABSOLUTE      = 0x00008000,
                RIGHTDOWN     = 0x00000008,
                RIGHTUP       = 0x00000010,
                RIGHTCLICK    = 0x206,
                MOUSE_WHEEL   = 0x00000800
            }
    
        }
    }
    
    Yamecoder 야매코더_
    C# 2010.12.04 02:24

    [XNA3.1 index buffer vertex buffter] 교과서와는 다른 버퍼메모리 사용법


    한참을 방황했다.. 버퍼가 안되서..

    DrawUserIndexPrimitives  vs  DrawIndexPrimitives   라는 주제를 한번쯤 보았을것이다.

    물론 후자쪽이 빠르다. 그런데, 가지고 있는 한글번역판 책들은 죄다 xna1.0 버전이라,, 그런지

    xna3 에서는 사용법이 달랐다.




    Created with colorer-take5 library. Type 'csharp'
    
    public void setVertices()
            {
                
               // vertices 들 ~//
                //vertexBuff 라는 멤버 변��가 있겠죠..
                vertexBuff = new VertexBuffer(device.GraphicsDevice, VertexPositionNormalTexture.SizeInBytes * vertices.Length, BufferUsage.WriteOnly);
                vertexBuff.SetData(vertices);
            }
            public void setIndices()
            {
    
               //index들  ~//
                //indexBuff 라는 멤버 변��가 있겠죠..
                indexBuff = new IndexBuffer(device.GraphicsDevice, typeof(int), indices.Length, BufferUsage.WriteOnly);
                indexBuff.SetData<int>(indices);
            }
            
    
             //메인클��스에 update()에 넣어야 함
            public void update()
            {
                device.GraphicsDevice.Vertices[0].SetSource(vertexBuff, 0, VertexPositionNormalTexture.SizeInBytes);
                device.GraphicsDevice.Indices = indexBuff;
            }
    
            //메인클��스에 draw()에 넣어야함
            public void render(Matrix view , Matrix projection)
            {
                effect.World = Matrix.Identity; ;
                effect.View = view;
                effect.Projection = projection;
    
                effect.Begin();
    
                /* //여러개일경우
                foreach (EffectPass p in effect.CurrentTechnique.Passes)
                {
                    p.Begin();
                    device.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
                    p.End();
                }*/
    
                effect.CurrentTechnique.Passes[0].Begin();
                device.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
                effect.CurrentTechnique.Passes[0].End();
    
                effect.End();
               
            }
    
    물론 여러가지 방법이야 있겠지만 꾀나 골머리를 썩은 문제이므로 일단 이대로 ..

    update 부분은 render 에도 해도 되나 그냥 로직과 분리를 하고 싶은 마음에서 한거다.

    한가지 덧붙이자면

    effect.World 라던지 effect.View 라던지 effect.Projection 은 변경사항이 없다면

    따로 메소드를 빼서 루프를 돌리지 않는 방법도 있다.





    ( 첫째도 퍼포먼스 둘째도 퍼포먼스 셋째는 수면... ? )

    Yamecoder 야매코더_
    XNA 2010.12.04 02:20

    [XNA Rectangle on 3D] 사각형을 그려보자 (제발)



    우선 목표는 이러하다 , 사각형의 중심을 원점 으로 한 3d 상의 사각형을 만들것이다.

    그리고 텍스쳐도 입혀 보자.

    이목표를 실현 하기 위해서는 어느정도의 준비 과정이 필요하다. 바로 카메라의 셋팅이다.

    물론 기본적으로 생성되어 있지만 3D 물체를 제대로 볼수가 없다.


    Game1.cs


    코드는 간단하나 워낙 단어들이 길어서 따로 주석을 포함한 소스코드를 참고 할것.
    Yamecoder 야매코더_
    XNA 2010.12.04 02:16

    [C# FileDialog] 간단한 Open / Save 파일 다이얼로그


    Created with colorer-take5 library. Type 'csharp'
    
    //파일 ��픈 다이얼로그
                OpenFileDialog openPanel = new OpenFileDialog();
                openPanel.InitialDirectory = "d:\\";
                openPanel.Filter = "CustomFile (*.cus)|*.cus|txt (*.txt)|*.txt | All files (*.*)|(*.*)";
                if(openPanel.ShowDialog() == DialogResult.OK)
                {
                    Trace.WriteLine("OK      " +openPanel.FileName+ " " 
                                                                   + openPanel.SafeFileName);
                }
                
                
                
                //파일 세이브 다이얼로그
                SaveFileDialog savePanel = new SaveFileDialog();
                savePanel.InitialDirectory=@"d:\";
                openPanel.Filter = "CustomFile (*.cus)|*.cus|txt (*.txt)|*.txt | All files (*.*)|(*.*)";
                if(savePanel.ShowDialog() == DialogResult.OK)
                {
                    Trace.WriteLine("OK      " +savePanel.FileName+ " ");
                }
    
     
     
     
     
     
    ShowDialog()를 단독으로 호출하고 FileOK 이벤트로 사용자 입력을 감지할수 있다.
    오픈파일다이얼로그의 fileName 은 경로를 포함한 문자열이고 SafeFileName 은 순수한 파일 이름만이다.




    파일필터 적용 모습

    Yamecoder 야매코더_
    tags : csharp, file, FileDialog, IO
    C# 2010.12.04 00:17

    [C# Thread]종료시 프로세스 죽이기



    Thread 를 사용하고, 프로그램을 그냥 종료 하면 작업관리자에 프로세스가 완전히 죽지 않는

    경우가 생긴다.

    이때 C#의 ApplicationExit 이벤트로 처리해주어야 한다.




    Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    
    
    ///....///
    
    
    
              void Application_ApplicationExit(object sender, EventArgs e)
            {
                try{
                server.Stop();
                if(clinet != null)
                    clinet.Close();
                writer.Close();
                reader.Close();
                serverThread.Abort();
                }catch{}
            }
    
    여기서 server는 TCPListener  이고 Client 는  TCPClinet 이고, writer 와 reader 는 

    StreamWriter 와 StreamReader 이다.

    여기서 serverThread 가  Thread   이다.


    이런식으로  app 가 종료되는 시점을 파악하여 여지가 될만한것들을 모두 삭제하여야 한다.
     
    Yamecoder 야매코더_
    C# 2010.12.04 00:16

    [BeginInvoke] Delegate 로 스레드에 매개변수 전달하기



    보통 스레드를

    Thread t = new Thread( new ThreadStrat(Method) );

    의 형태로 사용 하는데 Method 에 매개변수를 전달하지 못한다는 제약이 있다.

    그래서  delegate 의 BeginInvoke 메소드를 통해 스레드를 작성해보자.




    Created with colorer-take5 library. Type 'csharp'
    
    /*
     * SharpDevelop으로 작성��었습니다.
     * 사용자: jjongun
     * 날짜: 2010-02-04
     * 시간: ��후 4:48
     * 
     */
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;
    using System.Net;
    using System.Diagnostics;
    
    namespace testSockerServer
    {
        /// <summary>
        /// Description of MainForm.
        /// </summary>
        public partial class MainForm : Form
        {
            //스레드로 만들 델리게이트 선언
            delegate void runDele(string str);
            public MainForm()
            {    
                InitializeComponent();
                
                Trace.WriteLine("��제 메인 스레드 id: " +Thread.CurrentThread.ManagedThreadId);
                
                //델리게이트 생성
                runDele d = new MainForm.runDele(this.initServer);
                //BeginInvoke 로 매개변�� 전달
                d.BeginInvoke("string value",null,null);
            }
            
            private void initServer(string str)
            {
                Trace.WriteLine("델리게이트로 만든 스레드 id: " +Thread.CurrentThread.ManagedThreadId +"\n"
                               +str);
            }
        }
    }
    
    /**
     *   출력 : 
     * 
     *  ��제 메인 스레드 id: 1
     *    델리게이트로 만든 스레드 id: 3
     *     string value
     *  
     * */
    
    Yamecoder 야매코더_
    C# 2010.12.04 00:11

    [Windows form Invoke] System.Timers.Timer 로 windows form 접근하기


    http://blog.daum.net/starkcb/117

    를 보면 System.Timers.Timer (이하 시스템타이머) 로 윈도우 폼에 접근이 안된다는것을 확인할수 있다.

    하지만  Invoke메서드 를 이용한 본인의 삽질끝에 발견했다.


    SharpDeveloper 사용




    Created with colorer-take5 library. Type 'csharp'
    
    /*
     * System.Timers.Timer 로 windows form  접근��기 
     * lang : c#
     */
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Timers;
    using System.Diagnostics;
    
    namespace test
    {
        public partial class MainForm : Form
        {
            //��Invoke 를 위한 델리게이트 선언��
            private delegate void transDelegate(string srt);
            
            private TextBox tx = new TextBox();
            private System.Timers.Timer tm;
            
            //델리게이트�� 인스턴스
            private transDelegate d;
            private int testnum = 0;
            
            public MainForm()
            {
                InitializeComponent();        
                
                //간단한 textbox 생성
                tx.SetBounds(0,0,this.Width , this.Height);
                tx.Multiline = true;
                Controls.Add(tx);
                
                //프로그램 종료시 이벤트 등록
                this.Disposed += new EventHandler(MainForm_Disposed);
                
                //시스템 타이머 메소드
                testTimer();
            }
            
    
            private void MainForm_Disposed(object sender, EventArgs e)
            {
                Trace.WriteLine("exit");
                tm.Stop();
            }
            
            
            private void testTimer()
            {
                //타이머�� 선언과 활용
                tm= new System.Timers.Timer();            
                tm.Interval = 100;
                tm.Start();
                //타이머이벤트 등록
                tm.Elapsed += new ElapsedEventHandler(tm_Elapsed);
                
                //델리게이트�� 활용
                d = new MainForm.transDelegate(tx.AppendText);
            }
            
            
            private void tm_Elapsed(object sender, ElapsedEventArgs e)
            {
                //Invoke 활용 ( 타겟 , 타겟에 대한 매개변��);
                Invoke(d , "sec :  "+testnum +"\r\n");
                testnum ++;
            }
        }
    }
    
    Yamecoder 야매코더_
    C# 2010.12.04 00:09

    [C# XNA][texture2D.Setdata] XNA에서 픽셀을 하나하나 다루어 보자.

    xna의 API 가 익숙하지 않았던때, 픽셀을 다루기 위해 C#의 기본 GDI를 이용해여
    마샬링 하여 텍스쳐에 붙였다.

    그런데,. 반전이.. zune hd 에서 사용할수 있는 네임스페이스가 극히 제한적이라..
    Bitmap은 가져 오지 못한다.

    그래서 텍스쳐하나당 한픽셀을 그려야 된다고 생각하자 말도안되는 리소스 낭비이다.
    텍스쳐2D 와 Draw메소드를 엄청나게 사용해야되서, 도저히 용납할수 없는 코딩이 될것이다.


    고민끝에,  ,.XNA짱인,.  곰동님에게 긴급 질문했다. 그리고 친절히 답해 주셨다.
    http://blog.naver.com/fly33499  )



    위의 그림처럼 하나의 Texture2D에 여러개의 setData를 이용해 픽셀들을 다룰수 있다.

    드디어 2D 비트맵을 다룰수 있게 되었다 마치 bitmapData의 setPixel 처럼 자유롭다.

    기본적인 사용법은 이러하다.

    주석 위주로 보면 됨


    Created with colorer-take5 library. Type 'csharp'
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;
    using Microsoft.Xna.Framework.Net;
    using Microsoft.Xna.Framework.Storage;
    
    namespace WindowsGame9
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
            Texture2D tx;
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
                graphics.PreferredBackBufferWidth = 272;
                graphics.PreferredBackBufferHeight = 480;
            }
    
            protected override void Initialize() { base.Initialize(); }
                    
            protected override void LoadContent()
            {
                spriteBatch = new SpriteBatch(GraphicsDevice);
                tx = new Texture2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
    
                //픽셀����그리기 (레벨 , 위��(x좌표,y좌표,1,1), 컬러값  ~ )
                tx.SetData<Color>(0, new Rectangle(0, 0, 1, 1),new Color[]{Color.Black} ,0, 1, SetDataOptions.None);
                
    
                //응용! 면적 체우기 
    
                //화려한?컬러값을 위해 랜덤 함�� ��출
                Random r = new Random();
                Color c;
    
                //가로크기
                for (int i = 0; i < graphics.PreferredBackBufferWidth; ++i)
                {
                    //세로크기
                    for (int j = 0; j < graphics.PreferredBackBufferHeight; ++j)
                    {
                        //랜덤 컬러
                        c = new Color(new Vector3(r.Next(i), r.Next(j), r.Next(3)));
                        //픽셀만들기 , 총 272 * 280 개 만큼 그린다.
                        tx.SetData<Color>(0, new Rectangle(i, j, 1, 1), new Color[]{ c } , 0, 1, SetDataOptions.None);
                    }
                }
            }
    
            protected override void UnloadContent(){  }
    
            protected override void Update(GameTime gameTime)
            {
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    this.Exit();
                base.Update(gameTime);
            }
    
            protected override void Draw(GameTime gameTime)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);
                
                //시작��고 그리고 끝내고 는 기본.
                spriteBatch.Begin();
                spriteBatch.Draw(tx, new Vector2(0, 0), Color.White);
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
        }
    }
    

    아직 깊게 봐야 할것이 많이 있지만, 우선 요것 가지고 쉽게 사용할수있도록
    AS3 스타일로 클래스를 랩핑하면 매우 유용할듯하다.

    원하는대로 Circle 이라던지 Line 이라던지 이제 루프만 잘 돌리면 된다.

    다시한번 곰동님께 감사입니다~

    ※ zune hd의 해상도가 272 * 480 이라서 이러한 크기에서 테스트중..
     
    Yamecoder 야매코더_
    XNA 2010.12.04 00:08
    Powerd by Tistory, designed by criuce
    rss