C#으로 툴을 만들거나 하다보면, IDLE 처리가(실시간 처리등) 필요할때가 있습니다.
특히 게임 같은 경우 프레임 단위로 처리가 이루어지기 때문에 꼭 필요하죠.
하지만 보통 MFC나 C# 같은 경우는 보통 메시지 이벤트 단위로 처리를 하기때문에...
IDLE 처리를 위해서는 기본으로 생성해주는 코드에서 약간 변경을 해주어야 합니다.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace processidle
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 원래 루틴
// Application.Run(new Form1());
using (Form1 frm=new Form1())
{
// frm.Created를 true로 만들기 위함
frm.Show();
while (frm.Created)
{
// 이벤트 처리
Application.DoEvents();
// 여기서 idle 처리
}
}
// 종료
Application.Exit();
}
}
}
using System.Collections.Generic;
using System.Windows.Forms;
namespace processidle
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 원래 루틴
// Application.Run(new Form1());
using (Form1 frm=new Form1())
{
// frm.Created를 true로 만들기 위함
frm.Show();
while (frm.Created)
{
// 이벤트 처리
Application.DoEvents();
// 여기서 idle 처리
}
}
// 종료
Application.Exit();
}
}
}
DoEvents에서 메시지 처리를 하게 되고, 그 밑의 공간에 IDLE 처리를 할 함수를 호출하거나 원하는 작업을 코딩하면, 실시간 처리가 가능하게 됩니다.
그리고 한가지 더 눈여겨 볼 것은 Form1을 생성할때 쓰는 using 키워드입니다. using은 네임 스페이스 선언에만 쓰이는 것이 아니라 위 처럼 쓰일수 있는데... 여기서 사용된 using의 용도는 밑의 코드와 같은 의미입니다.
Form1 frm=new Form1())
// frm.Created를 true로 만들기 위함
frm.Show();
while (frm.Created)
{
// 이벤트 처리
Application.DoEvents();
// 여기서 idle 처리
}
frm.Dispose();
// frm.Created를 true로 만들기 위함
frm.Show();
while (frm.Created)
{
// 이벤트 처리
Application.DoEvents();
// 여기서 idle 처리
}
frm.Dispose();
C#에서는 C++의 delete 처럼 메모리를 해제하는 Dispose 함수가 있는데, using에서 선언된 객체가 범위를 벗어나면 자동으로 Dispose 함수가 호출되어 객체를 제거하는 기능을 가진 키워드입니다.