C++ Thread Class
글쓴이: maxswjeon / 작성시간: 수, 2015/12/23 - 1:49오전
C++ Thread Class 가 급히 필요해서 제작한 소스가 인자전달이 에러나네요....
일단 인자전달은 안되지만 실행은 되는 코드를 올려보긴 하겠습니다...
저는 아직도 Start부분에 Thread 생성을 CreateThread로 하는 게 마음에 걸리네요...
도와주세요
Thread.h
#pragma once #define WIN32_LEAN_AND_MEAN #include <Windows.h> class Thread { protected: HANDLE Handle; DWORD ID; private: Thread(const Thread& bt); Thread& operator = (const Thread& bt) {}; static DWORD WINAPI StaticThreadStart(LPVOID lpParam); protected: virtual DWORD Run(void) = 0; public: Thread(); virtual ~Thread(); bool Start(); void Stop(); inline HANDLE GetThreadHandle(); inline DWORD GetThreadID(); inline bool IsRunning(); inline void Join(); inline BOOL Yeild(); inline void Sleep(DWORD dsMilliiseconds); inline DWORD Suspend(); inline DWORD Resume(); };
Thread.cpp
#include "Thread.h" #include <stdexcept> using namespace std; DWORD WINAPI Thread::StaticThreadStart(LPVOID lpParam) { Thread* pThread = (Thread*)lpParam; return pThread->Run(); } Thread::Thread() : Handle(NULL), ID(0) { } Thread::~Thread() { if (Handle) CloseHandle(Handle); } bool Thread::Start() { if (Handle) { if (WaitForSingleObject(Handle, 0) == WAIT_TIMEOUT) { // Thread Still Running return false; } CloseHandle(Handle); } Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread::StaticThreadStart, this, 0, &ID); if (Handle != NULL) return true; return false; } void Thread::Stop() { if (this->IsRunning()) { ::TerminateThread(Handle, -1); } if (Handle) { CloseHandle(Handle); Handle = NULL; } } inline HANDLE Thread::GetThreadHandle() { return Handle; } inline DWORD Thread::GetThreadID() { return ID; } inline bool Thread::IsRunning() { if (Handle) { DWORD dwExitCode = 0; ::GetExitCodeThread(Handle, &dwExitCode); if (dwExitCode == STILL_ACTIVE) return true; } return false; } inline void Thread::Join() { ::WaitForSingleObject(Handle, INFINITE); } inline BOOL Thread::Yeild() { return ::SwitchToThread(); } inline void Thread::Sleep(DWORD dsMilliiseconds) { ::Sleep(dsMilliiseconds); } inline DWORD Thread::Suspend() { return ::SuspendThread(Handle); } inline DWORD Thread::Resume() { return ::ResumeThread(Handle); }
Forums:
한줄씩 지워보니.
이거 지우면 되네요.
// virtual DWORD Run(void) = 0;
순수가상함수라고 할겁니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
Thread.cpp에 아래와 같이 몇 줄 샘플코드를
Thread.cpp에 아래와 같이 몇 줄 샘플코드를 추가해보니 잘 동작하는 것 같습니다.
질문하신 인자전달에러라는 것이 무엇인지 재현이 가능한 간단한 코드를 올려주실 수 있나요?
일단은
이 소스는 정상 작동하는 소스입니다....
그런데 예를 들어 이 Thread를 어떤 렌데러를 실행시키려면 main 함수에서 이 Thread로 렌더러 포인터를 보내 주어야 하는 것인데,
이 소스에서는 렌더러를 줄 수 있는 방안이 없습니다....
그래서 Run부분에 void*형을 넣고 싶은데... 안되네요...
저는 그걸 도와주셨으면 합니다
언제나 감사드립니다
멤버변수를 하나 추가
아름다운 방법은 아니지만,
m_lpThreadParam 이라는 이름으로 void * 멤버변수를 하나 추가하고
Start() 멤버함수를 조금 바꾸면 간접적이나마 인자전달이 이뤄지겠네요.
수정한 Thread.h와 Thread.cpp를 올립니다.
바뀐 부분은 lpThreadParam 문자열을 검색하면 확인할 수 있습니다.
실행결과는 아래와 같이 나옵니다.
두 스레드가 각각 인자로 전달된 숫자만큼씩 루프돌고 종료되는 걸 보니
대충 동작은 되는 것 같습니다.
참고해보세요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기