장비제어 - 쓰레드의 생성

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함수 구성습니다.

클래스를 이용하여 쓰레드를 기본적으로 생성 하게 됩니다. 기타 쓰레드 생성할때도 이 클래스를 이용하여 쓰레드를 생성합니다.

 

 

반응형