C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1174] 지정한 시간에 지정한 함수 또는 메소드를 실행해주는 쓰레드 클래스
김태선 [cppbuilder] 7736 읽음    2016-05-08 17:57
지정한 시간이 되면 자신이 지정한 함수 또는 메소드가 현재 진행중인 코드의
실행 흐름을 방해하지 않고 실행되게 하면 코딩이 편리해집니다.

타이머를 하나 설정해서 이런 동작을 해도 되지만,
잠시 잠시 쓰는 용도라면, 타이머 객체를 생성하기 귀잖을때
쓱 긁어서 쓸수 있는 코드입니다.

사용 방법은 예제를 보면 간단히 알수 있습니다.

하나 주의할 것은 실행되는 함수 또는 메소드는 쓰레드 상에서 실행되는 것이기 때문에
당연히 코드도 쓰레드 세이프한 코드여야 합니다.
즉 화면 조작 같은 것을 안전하게 하고 싶으면 싱크로나이즈를 써야 한다는 뜻입니다.
이는 상식이니 따로 부언하지 않습니다.

타이머를 쓰게 되면 쓰레드 세이프한 코드에 대한 고려를 안해도 되고
메인 쓰레드에서도 동작해 코딩이 편리하므로,
필요에 따라 입 맛 대로 선택하면 됩니다.


// 지정한 시간에 지정한 함수 또는 메소드를 실행하는 쓰레드 클래스
// 지정 시간에 메소드 실행후 객체 자신은 스스로 사라짐.

	typedef void (*TMyFunc)(int arg);
	typedef void (__closure *TMyMethod)(int arg);

	class TTimerRun : public TThread
	{
		UINT		MSTime;
		TMyFunc		Func;
		TMyMethod	Method;
		int			Arg;

	public:
		TTimerRun(UINT ms_time, TMyFunc func, int arg) : TThread(false)
		{
			MSTime = ms_time;
			Func = func;
			Method = NULL;
			Arg = arg;
			FreeOnTerminate = true;
		}
		TTimerRun(UINT ms_time, TMyMethod method, int arg) : TThread(false)
		{
			MSTime = ms_time;
			Func = NULL;
			Method = method;
			Arg = arg;
			FreeOnTerminate = true;
		}
		void __fastcall Execute()
		{
			Sleep(MSTime);
			if (Func == NULL)
				Method(Arg);
			else
				Func(Arg);
		}
	};

// 이건 로컬 객체 식으로 사용할때 쓰는 래퍼 클래스.

class CTimerRun
{
public:
	TTimerRun *TimerRun;

public:

	CTimerRun(UINT ms_time, TMyFunc func, int arg)
	{
		TimerRun = new TTimerRun(ms_time, func, arg);
	}
	CTimerRun(UINT ms_time, TMyMethod method, int arg)
	{
		TimerRun = new TTimerRun(ms_time, method, arg);
	}
	~CTimerRun()
	{
	}
};


//---------------------------------------------------------------------------

void	Hello(int data)
{
	FormSKeyBoard->Caption = data;
}

void	TFormSKeyBoard::MyHello(int data)
{
	Caption = data;
}

void __fastcall TFormSKeyBoard::dxButton12Click(TObject *Sender)
{
	// 1초뒤 Hello 함수를 실행하라.
	TTimerRun *dummy1 = new TTimerRun(1000, Hello, 1111);
	// 2초뒤 MyHello 메소드를 실행하라.
	TTimerRun *dummy2 = new TTimerRun(2000, &MyHello, 1234);
	dummy1; dummy2;

	// 위에서 밑으로 코드가 바로 지체하지 않고 내려와 실행됨.
	Caption = 0;

}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
1174 지정한 시간에 지정한 함수 또는 메소드를 실행해주는 쓰레드 클래스 김태선 7736 2016/05/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.