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

카테고리

분류 전체보기 (2862)
Unity3D (899)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (192)
협업 (65)
3DS Max (3)
Game (12)
Utility (142)
Etc (99)
Link (34)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (20)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
프로세스와 스레드에 대한 개념은 어떤 프로그래밍 언어라 하더라두 공통으로 적용이 되는 부분입니다. C#에서 스레드를 사용하는 방식은 파라미터(Parameter)가 있냐 없냐에 따라서 달라집니다. 

파라미터(Parameter)가 없는 경우 
파라미터가 없는 경우에는 간단합니다. Thread 객체를 선언해 주고, 정의하는 과정에서 ThreadStart 를 만들어주면서 스레드가 동작시킬 함수명을 적어주면 됩니다. 

자 한번 볼까요?

Thread th = new Thread(new ThreadStart(test));
th.Start();

test 함수의 경우 void test() 가 생성되어 있어야 합니다. 위와 같이 적으면 스레드 객체를 생성하고 동작시킬 함수를 연결하고 바로 시작(Start()) 됩니다. 물론, 선언 따로, 정의 따로 시작따로 할수도 있겠죠. 



파라미터(Parameter)가 있는 경우 
파라미터가 있는 경우도 크게 어렵지는 않습니다만 Thread 객체를 정의할때, 조금 달라집니다. ThreadStart 대신에 ParameterizedThreadStart를 사용해서 Thread 객체와 동작시킬 파라미터가 있는 함수를 연결시킵니다. 

Thread th = new Thread(new ParameterizedThreadStart(test));
th.Start("Hello World");

public void test(string s)
{
...
}

위의 소스코드에서 보는것 처럼, 자신이 전달 하려는 파라미터 값에 대해서는 Start() 함수를 통해서 전달할 수가 있습니다. Start() 함수는 Overload되어있기 때문에 파라미터가 없이 Start()를 할수도 있지만, object 으로 파라미터를 전달해 주기도 합니다. 

참고로 .NET 1.1 Version 에서는 파라미터가 있는 경우에 대해서는 스레드의 지원이 안되었다고 합니다. 참고하세요^^ 

반응형
Posted by blueasa
, |

KGC2010문서들이 올라왔네요. 

<KGC2010 최종 강연자료> 웹하드(http://webhard.co.kr)를 통해 2010.09.16일 부터 프리젠테이션 파일 다운로드 가능. 아이디(KGC10TH) 비밀번호(kgc2010)

KGC 2010 후기와 발표자료를 모으고 있습니다. (계속 업데이트 됩니다)
이제 여기 저기 기웃거리며 돌아댕기지 않아도 강연 자료를 볼 수 있겠네요. 므흣


출처 : http://ozlael.egloos.com/3442955
반응형
Posted by blueasa
, |
이번 개최된 GDC 2010에서 쌈빡한 문서 없나 뒤져보던 중 발견한 판타스틱 오브 더 월드 굿 씨 문서를 하나 소개하고자 한다.

우선 스크롤의 압박을 견디지 못하는 분들을 위해 간략히 설명하자면 ...
 - 모델의 파츠를 미리 모델링한 메쉬로 바꿔치기가 아닌 실시간 랜더로 처리 하는 방식.
 - 버텍스 테이터를 재 구성하는 것이 아니라 셰이더에서 주어진 구형의 부분을 texkill

기존에는 모델 셋트를 따로 만들었기에 다양한 형태가 불가능한데 반해( Left 4 Dead 1 방식)
원본 모델 하나에 텍스쳐 투영으로 알파 clip하기 때문에 다양한 표현 가능( Left 4 Dead 2 방식)
어색하면 뻥 뚫려버린 부분에 구형 메시 삽입
디자이너의 수고도 덜고 플레이어가 공격한 정확한 위치에 파손을 줄 수 있고... 게다가 구현이 복잡하지도 않아 보인다.
긴말해서 뭐하리오 직접 문서를 봐보시라~! 첫페이지부터 뇌즙의 압박이 올지어니~ 
반응형
Posted by blueasa
, |

- 테이블에 자신의 키와 자기 부모의 키를 가지고 있는경우 재귀함수를 이용해 트리뷰를 구성

 

 

RwNm : 노드이름

RwCd : 노드키

PrntRw : 자신의 부모키

 

#region 트리뷰구성
private TreeNode CreateNode(string RwNm,string RwCd)
{
    //자신의 하위노드가 없을때까지 찾는다   

    TreeNode node = new TreeNode();
    node.Name = RwCd;
    node.Text = RwNm;

    foreach (DataRow r in RwCdTable.Rows)
    {
          if (RwCd == r["PrntRw"].ToString()) //자신의 키를 부모키로 갖고있는 노드검색
          {
              //System.Diagnostics.Debug.WriteLine(RwCd+ "->"+r["RwCd"].ToString());

              

              //재귀호출
              node.Nodes.Add(CreateNode(r["RwNm"].ToString(),

                                                        r["RwCd"].ToString()));                      
           }
     }
     return node; //자신의 하위노드를 다찾은 노드를 반환
}
#endregion

 

//함수사용

trvRw.Nodes.Add(CreateNode(strRwLevlNm,"00000000"));

 

자료구조시간에 배운 재귀함수를 회사에서 써먹게될줄이야...


출처 : http://blog.naver.com/tjr0807?Redirect=Log&logNo=150005240319

반응형
Posted by blueasa
, |

키보드, 마우스 하나로 컴퓨터 2대이상 제어를 하는것을 KVM이라고 하는데

이것은 장치(하드웨어)로도 있고 소프트웨어로도 있다.

지금까지 KVM 소프트웨어로는 synergy라는 것을 썼었는데 얼마전 노트북을 사면서

비스타에서 제대로 작동을 않하길래 새로운것을 찾아보았다.

 

몇가지 설치해보고 쓴결과 편하게 쓸만한것으로

INPUT DIRECTOR 이라는 프로그램 당첨!

 

자 그럼! 이걸 직설적으로 어디서 쓰느냐?

 

보는것처럼 위 이미지에서 좌측에 나의 노트북이 있는데 이걸 데스크탑 키보드, 마우스로 마치 모니터가 한개 더 생긴것처럼 이용하고

싶다고 생각했을때 사용하는게 이 프로그램이란 말씀!

 

자 이제 실습을~

1. 준비물

    컴퓨터 2대, 모니터 2개이상, 키보드 마우스 셋트 1개이상

2. 프로그램 다운

   http://www.inputdirector.com/

  

   사이트 상단에 "Download"를 클릭하시면 현재 몇가지 버젼을 다운받을 수 있다고 나오는데 입맛대로 받아라!

   나는 Input Director V1.1. 을 다운받았음.

   압축파일이니깐 압푹 푸시고 설치 하시면 됩니다.

3. 마스터 & 슬레이브 컴퓨터 IP 알기

   마스터 컴퓨터란 키보드 마우스가 달려있는 주인(?) 컴퓨터다! 이넘은 자기 밑에 속한 노예들을 착실히 관리할 놈이다.

   이제 각자의 방법으로 마스터와 슬레이브 컴퓨터의 IP를 알아내야 한다.

   나같은 경우 각 컴퓨터에서

   " 시작 > 실행 > CMD (엔터) > ipconfig (엔터) " 해서 나오는 정보로 확인한다.

  ㅇ 마스터 IP : 192.168.10.102

  ㅇ 슬레이브 IP : 192.168.1014

4. 마스터 컴퓨터 설정

    

  바탕화면에 위와같은 넘을 클릭한다음 아래 그림처럼 따라해보아라.

  

 위처람 했으면 마스터 컴퓨터 설정 완료!

  

5. 슬레이브 컴퓨터 설정

6. 자 이제 설정을 했으면 윈도우 시스템 트레이(시작아이콘 가장 우측)화면에서처럼 마우스 우측을 클릭한후

   마스터컴 퓨터는 Enable as Master

   슬레이브 컴퓨터는 Enable as Slave

   르 클릭만 하면 된다.

자! 이렇게 되었으면 마우스를 좌우 모니터로 왔다 갔다 해보시길~

움직일꺼라는!!


출처 : http://blog.naver.com/laci/30044811915

반응형
Posted by blueasa
, |
흔히 string 객체 중 null일 때 참조하여
exception을 내는 경우를 방지하기 위하여
아래와 같이 코딩하는 경우가 있는데
매번 이와 같이 하는 것도 귀찮은 일이다.

string str = null;
...

if(str != null && str.length > 0)
{
...
}

그러나 위와 같은 check를 하는 함수가 string class에 static function으로 존재한다.
모르면 손발이 고생 ;;
string.IsNullOrEmpty(str)
반응형
Posted by blueasa
, |
http://sourceforge.net/projects/cppcheck/

소스 코드 정적 분석 도구입니다.
소스코드를 분석해서 에러가 발생할 수 있는 부분을 찾아줍니다.


출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&page_num=40&select_arrange=last_comment&desc=&sn=off&ss=on&sc=on&keyword=&no=144&category=

반응형

'Link' 카테고리의 다른 글

종이천하  (0) 2010.12.20
Dot Net Perls  (0) 2010.11.08
C# 관련 블로그  (0) 2010.08.18
Visual Assist X 관련 링크~  (0) 2010.06.21
게임브리오 관련 사이트  (0) 2010.06.07
Posted by blueasa
, |

※ C#에서 호출시 C++/CLI 에서 리턴값, 파라미터값은 다음과 같이 처리합니다.

 

 [ String - BSTR (LPCTSTR) ]

// ex: Set

bool SetTestString(String^ strTestString)
{
   axTestCtrl1->TestString= strTestString;
   return true;

}

// ex: Get
String^ GetTestString()
{
   return axTestCtrl1->TestString;
}

short, int, long ]

 

: short, int, long 형은 그냥 주고 받으면 됩니다.

// ex: Set

bool SetShortVal(short nShortVal)
{
   axTestCtrl1->ShortVar = nShortVal;
   return true;
}

// ex: Get
short GetShortVal()
{
   return axTestCtrl1->ShortVal;
}

struct ]

// ex: 참조 가능한 구조체 선언

ref struct EocsTestStruct
{
   String^ eocsstrVal;
   short eocsnVal;
   long eocslnVal;
}

 

// ex: 구조체를 파라미터로 받아서 Set

bool SetEocsTestStruct(EocsTestStruct^% EocsTest)

{

   try

  {
      axTestCtrl1->ShortVar = nShortVal;

      axTestCtrl1->eocsstrVal= EocsTest->eocsstrVal;

      axTestCtrl1->eocsnVal= EocsTest->eocsnVal;
      axTestCtrl1->eocslnVal= EocsTest->eocslnVal;
      return true;

   }

   catch (Exception^ e) 
   {
       MessageBox::Show(e->Message);
       return false;
   }
}

...

... ING ... : 다른 케이스도 작업하다가 정리할 예정입니다.

...

반응형
Posted by blueasa
, |

gcnew로 생성하지 않기

 

C++/CLI는 클래스를 생성할 때 ‘gcnew’를 사용하지 않고 생성할 수도 있습니다.

 

리스트 1. ‘gcnew’를 사용하지 않고 클래스 생성하기 >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

          

           void func() { Console::WriteLine(L"Call func() - {0}", nNumber ); }

 

           int nNumber;

};

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

 

void foo2()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 2;

           MTest->func();

}

 

int main(array<System::String ^> ^args)

{

           foo1();

           foo2();

          

           getchar();

           return 0;

}


결과 >


<리스트 1> ManagedTest MTest; 는 비 관리 C++처럼 GC가 아닌 스택 영역에 생성하는 것으로 착각할 수도 있겠지만 전혀 아닙니다클래스를 생성하면 언제나 GC 영역에 만들어집니다

위의 코드는 그냥 ‘gcnew’ 사용을 우리가 생략하고 컴파일러가 대신 써 준다고 생각하시면 됩니다.

 

void foo1()

{

           ManagedTest MTest;

           MTest.nNumber = 1;

           MTest.func();

}

은 컴파일러에 의해서 아래의 코드로 바뀝니다.

void foo1()

{

           ManagedTest^ MTest = gcnew ManagedTest();

           MTest->nNumber = 1;

           MTest->func();

           delete MTest;

}

 

위의 코드를 보시면 아시듯이 gcnew를 사용하지 않고 클래스를 생성하면 우리가 직접 delete를 쓰지 않아도 되는 편리함을 얻을 수 있습니다.

gcnew를 사용하지 않는 것은 C#에서 ‘using’을 간략화 시킨 것으로 생각하면 좋습니다.


< C# using 문 사용 예 >

using (Graphics g = this.CreateGraphics())

{

    g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));

}

 

 

 

 

value 클래스

 

관리 클래스는 복사 생성자와 대입 연사자를 가지지 못하므로 아래의 코드는 컴파일 에러가 발생합니다.

 

리스트 2. >

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

ref class C {

    int i;

};


void func(C c) {}


int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

그러나 클래스를  ‘ref’가 아닌 ‘value’ 클래스로 정의하면 위의 코드는 컴파일 할 수 있습니다.

 

#include "stdafx.h"

#include <stdio.h>

 

using namespace System;

 

value class C {

    int i;

};

void func(C c) {}

int main()

{

    C c;

    C d;

    func(c);   // 에러

    d = c;     // 에러

}

 

value 클래스는 클래스간 복사를 할 수 있는 능력이 있습니다이 복사는 비트 단위의 복사로 이른바 ‘memcpy’와 같은 복사입니다.

value 클래스는 복사를 할 수 있으므로 value 클래스의 멤버는 절대 복사 가능한 멤버만 가질 수 있습니다그래서 아래와 같은 value 클래스 C는 컴파일 에러가 발생합니다.

 

ref class A

{

  int i;

};

 

value class C

{

  A a;

};

 

 

 value 클래스의 특징으로는 ref 클래스가 GC에서 만들어지는 것과 달리 스택에 만들 수 있습니다.

value class C

{

};

 

C c;

 

위 코드에서 클래스는 스택에 만들어집니다(물론 gcnew를 사용하면 GC에 만들어집니다)

 

value 클래스의 특징은 좀 더 있는데 위에 설명한 것들과 포함해서 아래와 같이 정리할 수 있습니다.

 


value 클래스의 특징

 

1. 기본 생성자를 가질 수 없다.

2. 복사 생성자를 가질 수 없다.

3. 대입 연산자를 가질 수 없다.

4. 소멸자를 가질 수 없다.

5. finalize를 가질 수 없다.

6. 클래스간 복사를 할 수 있다.

7. 복사 불가능한 것을 멤버로 가질 수 없다(ref 클래스 등).

8. 스택에 생성할 수 있다.

9. 다른 클래스를 계승할 수 없다( interface는 가능하다)

 

 

 


관리 클래스를 파라메터로 넘기기

 

ref class A

{

           int i;

};

 

void foo1( A a )

{

}

 

함수 foo1의 파라미터 정의는 클래스 A value 클래스일 때만 사용할 수 있습니다그러므로 아래와 같이 foo1의 파라미터를 정의해야 합니다.

void foo1( A^ a )

{

}

 

 

 

 

그 외….

 

C++/CLI에서 참조는 ‘%’을 사용합니다이것은 비 관리의 ‘&’와 구별이 됩니다.

%는 아래와 같은 경우에 유용하게 사용할 수 있습니다.

void foo( A^ a )

{

}

 

A a;

// foo( a );  // 에러

foo( %a ); // 성공


참조는 C#에서는 'ref', VB.NET에서는 'ByRef'와 같다고 생각하시면 됩니다.


// 값을 참조로 넘기는 경우

void valuebyref(int%i)
{
   i=5;
}

// 참조형을 참조로 넘기기
void refbyref(String^%s)
{
   s="newstring";
}

void main()
{
   int i=1;

   valuebyref(i);

   String^s="basestring";
   refbyref(s);
}
( 위 코드는 http://adversaria-june.blogspot.com/2006/08/ccli_26.html 에서 인용했습니다 )

 



구조체는 관리나 비 관리나 다른 점은 없습니다.


 

참조와 구조체는 너무 짧게 끝나버렸네요^^;


출처 : http://vsts2010.net/323

http://vsts2010.net/323

반응형
Posted by blueasa
, |

C C++의 큰 차이점의 하나가 바로 C++에만 있는 클래스입니다또 클래스는 객체 지향 프로그래밍 언어에서 자주 볼 수 있습니다.

 

C++/CLI에서 관리 클래스는 ‘ref’라는 키워드를 사용하여 만듭니다.

 

비 관리 클래스

class Test

{

};

 

관리 클래스

ref class Test

{

};

 

관리 클래스는 ‘ref’를 제외하고는 외관상으로는 비 관리 클래스와 비슷하지만 관리와 비 관리가 많이 다르듯이 관리 클래스는 비 관리 클래스와 다른점이 있습니다. 그러므로 이것을 잘 파악하고 있어야 합니다.

 

 

 

관리 클래스의 특징

 

1. 정적 할당은 안 된다무조건 가비지컬렉션(GC)에 동적으로 생성한다.

 

2. 복사 생성자를 만들 수 없다.

 

3. ‘^’(핸들이라고 부른다)과 ‘gcnew’를 사용하여 클래스를 생성한다당근 메모리 해제는 GC에서 관리한다.

 

4. 핸들은 네이티브의 ‘*’(포인터나 ‘&’(참조)와 비슷한 것으로 더 안정스럽다.

 

5. ‘delete’는 명시적으로 클래스에서 사용하고 있는 리소스를 해제할 때 사용하는 것으로 소멸자가 호출 되는 것이지 메모리에서 해제하는 것은 아니다 delete GC에 있는 메모리를 해제하는 것은 아니다.

 

6. delete로 소멸자를 호출하면 GC에 의해서 진짜 파괴될 때 소멸자는 호출되지 않는다.

(소멸자를 선언한 클래스는 자동적으로 IDisposable 인터페이스를 구현한다소멸자는 컴파일러에 의해서Dispose() 메소드로 치환된다).

 

7. 소멸자 이외에 'finalize'를 선언할 수 있다. finalize GC에서 인스턴스가 파괴될 때 호출된다 delete로 소멸자를 호출한 경우에는 finalize는 호출되지 않는다.

 

8. finalize는 ‘!’ 키워드를 사용한다.

 

 

 

관리 클래스 사용해 보기

 

코드 1. 관리 클래스 정의 및 사용 >

#include "stdafx.h"

 

using namespace System;

 

ref class ManagedTest

{

public:

           ManagedTest() { Console::WriteLine(L"New ManagedTest"); }

           ~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }

           !ManagedTest() { Console::WriteLine(L"finalize ManagedTest"); }

};

 

int main(array<System::String ^> ^args)

{

           Console::WriteLine(L"1.");

          ManagedTest^ MTest1 = gcnew ManagedTest();

           delete MTest1;

 

           Console::WriteLine(L"2.");

           ManagedTest^ MTest2 = gcnew ManagedTest();

          

           return 0;

}

 

결과 >





<코드 1> 설명



그림 1. <코드 1>의 소스 코드와 결과 >

 

<그림 1> 코드를 보면 3번의 ‘gcnew’, 4번의 ‘^’를 사용하여 ManagedTest를 생성하였습니다

<코드 1>에는 없지만 핸들은 포인터와 같은 것으로 관리 클래스의 멤버를 사용할 때는 ‘->’를 사용합니다.

5 delete를 사용하면 소멸자가 호출되어서 6번이 출력됩니다.

MTest2는 소멸자를 호출하지 않아서 8번에서 정의한 finalize가 프로그램이 종료할 때 호출됩니다(7).


 

<코드 1>은 아주 짧고 단순한 코드이지만 관리 클래스의 대부분의 특징을 다 나타내고 있습니다관리 클래스에 대한 설명은 아직 남아 있습니다이것은 다음 회에 또 설명하겠습니다.


출처 : http://vsts2010.net/314

cnf

반응형
Posted by blueasa
, |