장비제어 - 쓰레드의 생성
2017. 2. 1. 09:02ㆍ장비제어개발관한이야기
반응형
장비 시퀀스를 제어 할 때, 동시에 작업해야 하는 일이 발생한다. 그럴때 쓰레드로 작업을 분기해서 작업을 하게 됩니다.
오늘은 장비제어에서 쓰레드 생성에 대해서 포스팅 하려합니다.
쓰레드생성
쓰레드 생성 과 동작은 굉장히 심플하게 동작합니다. 장비제어에 필요한 것들은 이 심플한 클래스를 상속받아서 복잡하게 변신됩니다.
일단, 간단한 쓰레드 생성 부터 시작하겠습니다. 윈도우 프로그래밍 답게 AfxBeginThread 로 생성합니다.
아래에 소스를 보시면 이해하기 편할꺼라 생각됩니다.
헤더파일
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#pragma once
#include "MFrequencyTimer.h"
class IMSFSMInstance
{
public:
IMSFSMInstance(void);
virtual ~IMSFSMInstance(void);
enum eAction{ePause, eRun, eEmergency}; ///< FSM State
private:
CTimer m_cTimer;
CWinThread *m_ThreadId;
bool m_bRun; ///< Thread Run Flag
eAction m_eAction;
eAction m_eCurrentState;
void RunFSM();
static UINT startThread(LPVOID lParam); /** *프로세스(Thread) 생성 **/
UINT runThread(LPVOID lParam); /** *프로세스(Thread) 시작 **/
virtual void Run(void) = 0;
public:
void SetThState(eAction Action);
int GetThState();
CString TH_NAME;
INT_PTR Start(); /** * 프로세스(Thread) 시작 **/
void Stop(); /** * 프로세스(Thread) 정지 **/
};
|
cs |
CPP파일
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#include "stdafx.h"
#include "IMSFSMInstance.h"
IMSFSMInstance::IMSFSMInstance()
{
m_bRun = false;
m_ThreadId = NULL;
m_eAction = ePause;
m_eCurrentState = ePause;
}
IMSFSMInstance::~IMSFSMInstance()
{
}
INT_PTR IMSFSMInstance::Start()
{
m_bRun = true;
m_ThreadId = AfxBeginThread((AFX_THREADPROC)startThread, this);
return (INT_PTR)m_ThreadId;
}
void IMSFSMInstance::Stop()
{
SetThState(ePause);
m_bRun = false;
Sleep(1000);
if(m_ThreadId != NULL)
{
if(m_ThreadId->m_hThread)
WaitForSingleObject(m_ThreadId->m_hThread, INFINITE);
}
}
UINT IMSFSMInstance::startThread(LPVOID lParam)
{
IMSFSMInstance *pFSMInstance = (IMSFSMInstance*)lParam;
return pFSMInstance->runThread(lParam);
}
UINT IMSFSMInstance::runThread(LPVOID lParam)
{
IMSFSMInstance *pFSMInstance = (IMSFSMInstance*)lParam;
while(pFSMInstance->m_bRun)
{
pFSMInstance->RunFSM();
}
return 0L;
}
void IMSFSMInstance::RunFSM()
{
Sleep(1);
switch(m_eAction)
{
case ePause:
if(ePause != m_eCurrentState) m_eCurrentState = ePause;
break;
case eRun:
if(eRun != m_eCurrentState) m_eCurrentState = eRun;
Run();
break;
}
}
void IMSFSMInstance::SetThState(eAction Action)
{
m_eAction = Action;
}
int IMSFSMInstance::GetThState()
{
return (int)m_eCurrentState;
}
|
cs |
소스설명
기본적으로 쓰레드의 시작을 할수 있는 Start() 함수 , 쓰레드 완전정지를 Stop 함수, 쓰레드 상태를 변경하는 SetThState함수 로 구성습니다.
이 클래스를 이용하여 쓰레드를 기본적으로 생성 하게 됩니다. 기타 쓰레드 생성할때도 이 클래스를 이용하여 쓰레드를 생성합니다.
반응형
'장비제어개발관한이야기' 카테고리의 다른 글
장비제어에서 Log란? (0) | 2017.02.03 |
---|---|
파일관련 유틸 클래스 (0) | 2017.02.02 |
카메라 제어하자 - 카메라종류 (0) | 2017.01.23 |
나는 이렇게 한다. 장비개발에서 소스관리!!! (0) | 2017.01.21 |
레이어 설명에 앞서서...동적라이브러리 링크 (0) | 2017.01.17 |