기본 콘텐츠로 건너뛰기

라벨이 C#인 게시물 표시

C# 에서 Timer 사용할 때 주의할 점.

예전에 알고 지내시던 분의 질문을 받았다. Windows Forms 개발을 하는데, 주기적 (대략 1분)으로 데이터 요청을 하는 프로그램을 작성하기 위해서 Timer 를 사용하는데, 어떤 기능을 처리해야 하기 때문에 Sleep 을 같이 사용했다고 한다. 여기서 발생하는 문제는 Sleep 5초를 주었더니, Timer 까지 5초 동안 멈춘다는 것이다. Timer 라는 것은 기본적으로 시간의 흐름을 측정하는 기능이기 때문에 Sleep 을 했다고 해서 Timer 가 멈추는 일은 생겨서는 안된다. 그러나 실제 샘플을 만들어 보면 ... Timer 가 Sleep 만큼 동작이 멈추는 것을 확인할 수 있다. Windows Forms 는 UI Thread 를 사용하는 것으로 최적화 되어 있으며 여기서 Timer 를 쓰면 UI Thread 에 최적화된 System.Windows.Forms.Timer 가 사용된다. 여기서 문제의 발생이 시작되는 것이다. Sleep 을 사용하게 되면 UI Thread 가 Sleep 이 걸리기 때문에 여기에 속한 Timer 까지도 멈추는 것이다. 이런 문제를 해결하기 위해서는 System.Threading.Timer 를 사용해야 한다. 이 Timer 는 별도의 Thread 에서 동작하기 때문에 Sleep 의 영향을 받지 않는다. 언뜻 보면 쉬운 해결 방법인 것 같지만 Thread 가 분리되었기 때문에 Timer 가 돌아가는 Thread 에서 UI Thread 의 메서드나 컨트롤에 접근하기 위해서는 별도의 명령을 사용해야 하는 문제가 존재한다. 자~ 그럼 여기서 Timer 에 대해서 다시 한번 정리해 보도록 하자. .NET 에서 제공하는 Timer 들 .NET 에서는 기본적으로 3가지 Timer를 제공하고 있다. (MSDN) System.Windows.Forms.Timer - 사용자가 지정한 간격마다 이벤트를 발생시키며 Windows Forms 응용 프로그램에서 사용할 수 있도록 최적화 되어 있다. System

C# Interop - C# 과 C API 상호 운영성

C# 은 강력한 기능과 클래스들을 제공하기만 Window Application 의 작성을 위해서는 C 로 작성된 Library를 가져다 사용해야 하는 경우가 많이 발생한다. C# 은 기본적으로 포인터를 지원하지 않고, 관리되는 코드의 메모리 관리체계가 근본적으로 C와는 차이가 많기 때문에 C 와의 호환을 위해서는 특수한 기법을 사용해야 한다. 이를 위해서 제공되는 것이 C# 의 PInvoke 와 Marshalling 이다. 1. Using C DLL (PInvoke : Platform Invocation Service) C# 은 C DLL 의 관리되지 않는 코드 함수를 호출할 수 있도록 플랫폼 호출 서비스 (PInvoke)를 제공한다. 일반적으로 C 로 작성된 DLL 이나 WIN32 API 를 호출하는 용도로 사용된다. 1.1 DLL 함수의 정의 PInvoke 를 이용해서 WIN32 API를 정의하는 방법은 "DllImport" 를 이용하는 것으로 DllImportAttribute 클래스를 사용하여 특성 정의를 하면 된다. public DllImportAttribute( string dllName) 즉, 사용하려는 DLL 의 파일명을 파라미터로 지정하고 실제 사용하려는 함수는 특성의 바로 아래에 함수 선언을 하면 된다. 예) USER32.dll 의 MessageBox 함수 정의 using System.Runtime.InteropServices [DllImport(“user32”)] public static extern int MessageBox( int hWnd, String pText, String pCaption, int uType); 위의 예와 같이 선언하고 C# 코드에서 "MessageBo" 라는 이름으로 실제 함수를 호출할 수 있다. 단, 반드시 해당 함수는 "static extern" 으로 선언되어야 한다 . 1.2 Dll