[20160216] 자체 중단점을 가진 라인 모형

std::thread가 실행될 때 다른 라인에 의해 강제로 끝날 수 없기 때문에 업무 수요를 감안하여 새로운 방식으로 바꾸어야 합니다.그래서 오늘 이거에 대한 코드를 좀 썼어요.
(하지만 여전히 문제가 있다)
class procx /** HC TECH : MutableThread Version 0.1 ( build 1 , 20160216 )*/
{
public:
    procx(auto a)
    {
        func=a;
        cancel=false;
        done=false;
        status_code=0;
        s=nullptr;
    }
    ~procx()
    {
        delete s;
    }
    template <typename ... ARG>
    void start(ARG ... arg)
    {
        s=new std::thread(func,arg...);
    }
    void join()
    {
        if(s!=nullptr&&s->joinable())
        {
            s->join();
        }
    }
    void detach()
    {
        if(s!=nullptr&&s->joinable())
        {
            s->detach();
        }
    }
    bool isdone()
    {
        return done;
    }
    bool iscanceled()
    {
        return cancel;
    }
    int getcancelcode()
    {
        return status_code;
    }
    /// return: true : Thread is canceled. false: Thread is over. else will be blocked.
    bool trycancel()
    {
        cancel=true;
        join();
        return done;
    }
private:
    void* func;
    std::thread* s;
    bool cancel;
    bool done;
    int status_code;
};

procx 클래스는 하나의 라인 관리 클래스입니다.
만약 하나의 라인 함수가cancel에 있기를 원한다면, 이 방법은 작성할 때 다음과 같은 매크로 정의를 사용해야 한다
#define DECLX bool* doneflag,bool* cancelflag,int* _hc_status_code
#define SETUNDONE *doneflag=false;
#define SETDONE *doneflag=true;
#define CANCELPOINT(x) if(*cancelflag){*_hc_status_code=x;return;}

비교적 정규적인 작법은 다음과 같다
void proc_a(DECLX,int* ret)
{
    SETUNDONE
    CANCELPOINT(1);
    SETDONE
}

만약 전체 코드가 작동할 수 있다면 사용 방법은 반드시 이와 같아야 한다
int main()
{
    int ret=0;
    procx s(proc_a,&ret);
    /// Start Job "s"
    s.start();
    /// Try to cancel Job "s"
    s.trycancel();
}

그러나 아직은 컴파일을 할 수 없습니다. C++ 템플릿 방식을 통해 함수 매개 변수 전송을 지원하고, 길어지는 매개 변수 지식을 잘 파악하지 못한 것 같습니다.계속 노력해!

좋은 웹페이지 즐겨찾기