gSyncit Error 및 해결책

2015. 3. 19. 15:16

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

출처: http://gap85.tistory.com/140


C#, 크로스 스레드 작업이 잘못되었습니다.

방법: 스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출(참조: http://msdn.microsoft.com/ko-kr/library/ms171728.aspx)

InvalidOperationException
크로스 스레드 작업이 잘못되었습니다. 'textBox1' 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.

다른 스레드에서 컨트롤에 접근하려 할 때, 예외가 발생한다.
이 예외는 릴리즈 모드에서는 나타나지 않고, 디버그 모드에서만 나타난다고 한다.
이 예외를 무시하거나, Invoke하는 방법으로 크로스 스레드 작업을 가능하게 할 수 있다.

무시하는 방법은 아래 코드를 삽입하면 된다.

1
CheckForIllegalCrossThreadCalls = false;



출처 : http://itmbox.blogspot.kr/2012/07/c.html

Posted by 세모아
,

출처 : http://cafe.naver.com/cccculb/148


Delegate(대리자)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

장에서는 5장에서 언급한 대리자(Delegate) 대해서 보다 심도 깊게 다루게 것입니다. Delegate 메서드의 기능을 대신해 주는 대리자라고 배웠습니다. 메서드를 보다 효율적으로 사용하기 위하여 메서드 자체를 캡슐화하는 기능입니다. 그래서, 메서드를 대신하는 대리자를 호출하면 메서드를 직접 호출하지 않고도 메서드를 호출할 있습니다.

 

중요 !! 대리자(Delegate)

메서드의 대리자(Delegate)

 메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화할 있게 만들어 주는 방법

 

Delegate 주는 장점은 메서드 자체를 캡슐화하기 때문에 메서드를 보다 효율적으로 사용할 있게 해준다는 것입니다. 메서드를 어떻게 Delegate 하는지에 대해서 알아보겠습니다.

 

1단계 Delegate 메서드를 정한다.

여러분이 Delegate 만들기 위해서는 제일 먼저, Delegate 메서드를 정해야 합니다. Delegate 메서드를 정한다는 것은 어떠한 메서드가 대리자를 통해서 호출될 것인지의 문제입니다. Delegate 메서드는 다음과 같습니다.

 

Delegate 메서드 정하기

using System;

class 
AType{
  
public void F1() { //Delegate
 메서드 1
    
System.Console.WriteLine("AType.F1"
);
  }
  
public void F2(int x){ //Delegate
 메서드 2
    
System.Console.WriteLine("AType.F2 x=" 
+ x);
  }
}

12-1 Delegate 메서드 선택

 

void F1() void F2(int x) 메서드를 Delegate 것입니다. 메서드의 형태가 다르기 때문에 각각 Delegate 다르게 만들어 주어야 합니다. , 대리자 2개를 만들어야 하는 것입니다. Delegate 사용할 메서드가 정해졌다면 Delegate 선언해야 합니다. 다음은 Delegate 선언하는 방법입니다.

 

2단계 메서드에 맞는 Delegate 선언하기

Delegate 선언하려면 일단 메서드의 시그너쳐(Signature) 정확하게 일치시켜야 합니다. 그래서, 아래와 같이 Delegate 메서드의 리턴타입과 매개변수를 정확하게 일치시키고 있는 것입니다.

 

Delegate 선언하기

using System;

delegate void SimpleDelegate1(); 

//Delegate 선언 1  void F1()
delegate void SimpleDelegate2(int i); 

//Delegate 선언 2 void F2()

class 
AType{
  
public void 
F1() {
    System.Console.WriteLine(
"AType.F1"
);
  }
  
public void F2(int 
x){
    System.Console.WriteLine(
"AType.F2 x=" 
+ x);
  }
}

12-2 Delegate 선언하기

 

메서드의 시그너쳐

여러분은 메서드 오버로딩을 공부할 오버로딩 메서드를 만드는 방법에 대해서 배웠습니다. 오버로딩 메서드를 만드는 방법은 메서드의 시그너쳐(Signature) 다르게 해주어야 합니다. , 메서드의 매개변수와 매개변수의 데이터타입을 다르게 해주어야 하는 것입니다. 오버로딩에서는 메서드의 반환형은 시그너쳐로 이용되지 않지만 Delegate에서는 반환형도 시그너쳐에 포함됩니다.

 이름은 상관없지만 Delegate 선언할 메서드의 시그너쳐와 Delegate 시그너쳐는 반드시 일치시켜야 합니다.

 

3단계 임의의 객체 만들기

Delegate 메서드를 정하고 Delegate 선언했다면 이제 메서드가 포함된 클래스의 객체를 만들어야 합니다. 그래야 특정 객체의 메서드가 하나의 독립적인 Delegate로서 활동할 있습니다

Delegate 메서드를 포함한 클래스의 객체만들기

using System;

delegate void 
SimpleDelegate1();
delegate 
void SimpleDelegate2(int 
i);

class 
AType{
  
public void 
F1() {
    System.Console.WriteLine(
"AType.F1"
);
  }
  
public void F2(int 
x){
    System.Console.WriteLine(
"AType.F2 x=" 
+ x);
  }
//class

class 
DeleTest {
  
public static void 
Main(){
    AType atype = 
new AType(); //
객체 생성
  
}
//class

12-3 임의의 객체 생성

 위와 같이 F1() F2() 메서드가 포함된 AType 클래스의 객체 atype 선언했습니다. 다음은 atype 객체의 메서드를 실제 Delegate 만드는 작업을 하셔야 합니다.

 

4단계 Delegate 생성과 호출

마지막으로 Delegate 생성하여 해당 Delegate 호출해 주면 됩니다. 일반 메서드를 호출하듯이 간단하게 Delegate 이용하여 메서드를 호출할 있습니다.

 

&

DeleTest.cs

Ü Delegate 전체구현

using System;

delegate void 
SimpleDelegate1();
delegate 
void SimpleDelegate2(int 
i);

class 
AType{
  
public void 
F1() {
    System.Console.WriteLine(
"AType.F1"
);
  }
  
public void F2(int 
x){
    System.Console.WriteLine(
"AType.F2 x=" 
+ x);
  }
//class

class 
DeleTest {
  
public static void 
Main(){
    AType atype = 
new 
AType();
    SimpleDelegate1 s1 = 
new SimpleDelegate1(atype.F1); //Delegate 
생성
    
SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2); //Delegate 
생성
    
s1(); //Delegate
 이용한 호출 1
    
s2(1000); //Delegate
 이용한 호출 2
  
//main
//class

C:\C#Example\12>csc DeleTest.cs

C:\C#Example\12>DeleTest

AType.F1

AType.F2 x=1000

 

Delegate 만들 해당 Delegate 매개변수로 메서드의 이름을 넣어 주게 됩니다. 메서드를 매개변수로 넣어 주면 모든 Delegate 만들기 작업은 끝납니다. 그리고, 이제부터는 메서드를 호출할 객체를 이용하는 것이 아니라 대리자를 이용하여 호출이 가능한 것입니다. 물론, 대리자라 할지라도 메서드에 일치하는, 대리자에 맞는 매개변수를 넣어서 대리자를 호출하셔야 합니다.

 

절에서는 대리자(Delegate) 만드는 기본적인 방법에 대하여 알아보았습니다. 다음 절에서는 대리자를 이용한 실제 구현을 알아보도록 하겠습니다.


'Programming' 카테고리의 다른 글

C#, 크로스 스레드 작업이 잘못되었습니다.  (0) 2015.03.19
VC++ 단축키  (0) 2015.03.05
[펌] VC++ : error LNK2026 해결책  (0) 2015.03.05
Posted by 세모아
,

VC++ 단축키

Programming 2015. 3. 5. 20:25


Ctrl-K, C : 선택한 블록을 모두 주석 처리

Ctrl-K, U : 선택한 블록을 모두 주석 처리 해제 

Ctrl-A : 전체 코드 블럭잡기 -> Ctrl-K,F : 선택한 영역 자동 코드 정렬  (이거 다시 찾다가 포스팅하는 중...)


Ctrl-F7 : 현 파일만 컴파일

Shift+Ctrl-F7 : 현 프로젝트만 빌드 <- 내가 직접 설정: Tools -> Options -> Keyboard -  Build.BuildSelection   

VC++ 주석설정 단축키

http://sjw0612.egloos.com/1896680

Ctrl + K +C 
: 영역을 주석처리합니다.  

Ctrl + K + U 
: 영역 주석처리를 해체합니다


Posted by 세모아
,

error LNK2026: module unsafe for SAFESEH image.


구 버전에서 작성된 프로젝트를 신 버전으로 가지고 왔을때 가끔 보이는 에러.


해결방법(현재 사용중인 버전 studio 2012)

project property - Linker - commandLine - 하단의 Additional option 아래 텍스트 박스에 /safeseh:no  삽입

'Programming' 카테고리의 다른 글

VC++ 단축키  (0) 2015.03.05
static link(정적 링크) & dynamic link(동적 링크)  (1) 2015.03.03
책 - Learn Object Pascal with Delphi  (0) 2014.09.30
Posted by 세모아
,

My 요약 : 아래 색칠한 부분 참고



출처: http://sweeper.egloos.com/1792751


Static & Dynamic Library



1. Static library

Dynamic (linking) library (흔히 얘기하는 DLL)을 설명하기 위해 간단하게 정리한다.

특정 기능의 라이브러리를 static 하게 제작한다는 것은 link 단계에서
라이브러리(*.lib 파일)를 실행 바이너리에 포함시킨다는 얘기이다.

즉, 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 
포함되기 때문에 별도의 추가 작업없이, 그리고 독립적으로(실행 바이너리만으로...)
라이브러리 함수들을 사용할 수 있다.

하지만, 정적 라이브러리를 사용하는 프로그램이 늘어나면 날수록
불필요하게 실행 파일들의 크기가 커지며, 
라이브러리가 동시에 여러 실행 바이너리에 포함되어 실행되는 경우
메인 메모리의 공간 활용 효율이 떨어지는 등 multiple-caller program이 존재하는 경우 그다지 바람직하지 않다.

정적 라이브러리를 사용하기 위해서는 프로젝트 설정의 Link 옵션에 
라이브러리를 추가해 주거나 아래의 #pragma 지시자를 사용하면 된다.

#pragma comment(lib, "NAME.lib")


2. Dynamic (linking) library : DLL

말 그대로 "동적으로 링크하여 사용하는 라이브러리" 이다.

동적 라이브러리는 이를 사용하고자 하는 실행 바이너리에서 
필요시 사용할 수 있도록 최소한의 정보만 포함하여 링크하거나,
아예 독립적으로 DLL을 로드/사용/해제할 수 있다.

1) Implicit linking

DLL을 구현하고 컴파일하고 나면 static library와는 다르게  output file이 2개 생성된다.
하나는 *.lib 파일이고 하나는 *.dll 파일이다.
여기서 *.lib 파일은 static library의 *.lib 파일과는 전혀 다르다.

Static library의 *.lib 파일은 라이브러리 전체 코드를 포함하는 바이너리이며,
DLL의 *.lib 파일은 DLL이 제공하고자 하는 함수 정보(함수명)을 가지는 정보 파일이다.

DLL의 *.lib 파일을 이용하여 링킹하는 것을 암시적 링킹(implicit linking)이라고 한다.
실행 바이너리를 링크 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일을
함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 되는 것이다.
(한 줄로 요약하면 *.lib 파일은 링크시 필요하고, *.dll 파일은 실행시 필요하다)

정적 라이브러리를 사용할 때와 같이 프로젝트 설정의 Link 옵션에 
라이브러리를 추가해 주거나 아래의 #pragma 지시자를 사용하면 된다.

#pragma comment(lib, "NAME.lib")

2) Explicit linking

명시적 링킹에서는 *.lib 파일이 필요하지 않다.
실행 바이너리 링크 단계에서 DLL의 함수 정보가 필요하지 않기 때문이다.

명시적 링킹에서 사용되는 세 가지 함수와 역할은 다음과 같다.

1. LoadLibrary : 필요한 DLL을 프로세스 가상 메모리에 맵핑한다.
2. GetProcAddress : DLL 함수의 포인터를 획득한다.
3. FreeLibrary : 프로세스 가상 메모리에서 DLL을 반환한다.

프로세스는 내부적으로 DLL의 레퍼런스 카운트를 계산한다.
LoadLibrary 호출시 DLL의 (프로세스) 레퍼런스 카운트는 1씩 증가하고,
FreeLibrary 호출시 레퍼런스 카운트가 1씩 감소한다. 
레퍼런스 카운트가 0이 될 때 해당 DLL은 프로세스 가상 메모리에서 해제된다.

여기서 주의할 점이 물리 메모리가 아닌 가상 메모리에서의 반환(해제)라는 것이다.
레퍼런스 카운트는 각 프로세스 내부의 호출 회수이지,
전체 프로세스 간의 호출 회수가 아니라는 것이다.

이러한 레퍼런스 카운트를 두는 이유는 프로그램 실행 중에 
DLL을 가상 메모리에 할당, 해제할 수 있도록 하기 위함이다.
(Implicit linking 방식에서는 이러한 장점을 얻을 수 없다.)

정리해서 명시적 링킹의 장점을 세 가지 정도 정리해 보면...

1. DLL이 필요한 시점에서 로딩하고, 불필요해지면 반환하기 때문에 메모리가 절약된다.
2. 프로그램 실행 중에 DLL 교체 및 선택이 가능하다.
3. 암시적 링킹은 프로그램 실행 전에 필요한 모든 DLL을 메모리에 로딩한다.
때문에 실행까지 걸리는 시간이 길어질 수 있다. 반면에 명시적 링킹은 필요한 순간에
하나씩 DLL을 로딩할 수 있기 때문에 그만큼 실행까지 걸리는 시간이 짧고, 
DLL 로딩에 걸리는 시간을 분산시킬 수 있다.

뭐 위와 같이 명확한 장점들이 있음에도 불구하고 암시적 링킹이 더 선호되는 경우가 있는데,
이는 사용하기 쉽기 때문이다. 코드가 간결해 진다는 것, 사용하기 쉽다는 것은
대부분의 경우에 있어서의 성능보다도 더 큰 장점을 지니는 것이 아닌가 생각해 본다.

Posted by 세모아
,