클래스 생성자에서 메소드를 스레드로 띄우려면?

61 views
Skip to first unread message

r2nato

unread,
Sep 5, 2006, 5:56:58 AM9/5/06
to kaug
클래스를 싱글톤으로 생성하고, 내부에서 여러개의
스레드를 돌리려고 합니다.
생성자에서 클래스 메소드를 스레드로 띄우려고
하는데, Thread_Manager로는 문제가 있네요.

ACE_Thread_Manager::instance()->spawn(this->Worker);

이렇게 호출을 하면 컴파일 시점에서 아래와 같은
에러가 납니다.

error C2664: 'ACE_Thread_Manager::spawn' : 매개 변수 1을(를)
'ACE_THR_FUNC_RETURN (void *)'에서 'ACE_THR_FUNC'(으)로 변환할
수 없습니다.


'&ClassName::Worker' 와 같은 식으로도 시도해봤지만 잘
안되네요

Task를 사용해서 active하면 되긴하는데, run 메소드
하나밖에 스레드로 띄울 수 없어서 가급적 Thread
Manager를 이용하려 하는데요. 아시는 분 계시면
조언부탁드립니다 (__*)

redpixel

unread,
Sep 7, 2006, 7:33:58 AM9/7/06
to kaug...@googlegroups.com
클래스안에 ACE_Task_Base를 맴버로 원하시는 만큼 생성하는 방법은 어떨까요? ^_^ 쓰레드 관리자는 있다 정도만 알고 있지, 저도 실전에서 거의 쓰는 경우는 없었습니다. task관련 클래스만으로도 충분하던데요. ^_^

2006/9/5, r2nato <r2n...@gmail.com >:



--
Kwon Tai-in
http://www.redwiki.net
PGPkey: https://keyserver2.pgp.com/vkd/DownloadKey.event?keyid=0xAFA5E4510E5B4EF9
MSN,GTalk ID : redwi...@gmail.com

r2nato

unread,
Sep 8, 2006, 4:07:23 AM9/8/06
to kaug
redpixel님 답변 감사합니다~

조언해주신 방법으로는 생성된 ACE_Task_Base에서
부모객체(뭐라고부르는지-_-;) 멤버변수로의 접근이
번거로울것같아서요.
일일이 인자로 넘겨주는 방법밖에 없을것같은데..

그래서 해결책을 찾았는데, 스레드함수를 static으로
선언하면 되더라고요.

static 멤버함수에서는 클래스 멤버에 접근이
불가능하기때문에
스레드를 생성할 때 인자로 this를 넘겨주면,
스레드에서는 넘겨받은 void포인터를 형변환하여 쓰면
되고,
저같은 경우는 어차피 싱글톤으로 된 객체라서
싱글톤 인스턴스를 얻으면 private까지 접근 할 수
있더군요 ㅎㅎ

r2nato

unread,
Sep 8, 2006, 4:27:44 AM9/8/06
to kaug
아, 혹시 더 깔끔한 방법은 없을까 하다가
생각난건데요.

task의 activate는 svc라는 멤버함수를 스레드로
띄우잖아요?

svc에서 멤버변수로의 접근이 자유로운걸로 봐서 svc가
static은 아니고,,,.

어차피 내부적으로는 task도 winapi인 CreateThread를
쓸텐데,
애시당초 클래스 멤버함수는 함수호출규약이 다르니,
CreateThread함수로도 잘 안되더라고요.


어떤 파일을 열어보면, svc와 activate의 비밀관계에
대해 알아낼 수 있을까요? -_-a

redpixel

unread,
Sep 10, 2006, 12:12:54 PM9/10/06
to kaug...@googlegroups.com
뭐, ACE도 C++로 작성했으니 r2nato님이 알고 계신 범위를 벗어나질 않습니다. ^_^ task.cpp에서 ACE_Task_Base::svc_run 부분을 보세요. 이 함수 자체가 static이며, ACE_Task_Base::activate 함수를 보시면 svc_run을 가지고 spawn을 하는 것을 알 수 있습니다.

ACE는 모든 함수들을 wrapper로 따로 구현하고 있습니다. win32 함수라면 POSIX쪽에 비슷한 기능을 하는 함수가 있는지(리눅스 manpage같은데서 찾으면 되겠죠. 구글링도 좋습니다.) 찾아보신다음 그 함수이름으로 ACE 레퍼런스에서 찾아보시면 됩니다. createthread와 같은 기본 API는 ACE_Thread::spawn 으로 wrap되어있는 거 같네요.

좀 익숙해지면 MSDN은 별로 안봐도 거의 구현되어있다는 걸 알 수 있답니다. 적어도 쓰레드와 동기화, 네트워크 쪽은요. ^_^

2006/9/8, r2nato <r2n...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages