C/C++/MFC
쓰레드 인자 넘기기 4바이트 아하, 또는 그 이상인 방법
2006.07.03 18:23
4바이트 이하일 경우 – 문자열 같은 경우
포인터는 4바이트이므로 4바이트보다 작거나 같은 크기의 변수는
그냥 그 값 자체를 넘겨도 됩니다.
CString 처럼 객체나 구조체 등 크기가 큰 것은 포인터로 넘기구요.
int send;
send = 100;
AfxBeginThread(ThreadProc, (void*)send);
이런식으로 그냥 100을 날리세요.
AfxBeginThread 함수는 바로
ThreadProc 스레드 프로시져를 호출하지는 않습니다.
AfxBeginThread 를 호출한 함수가 끝나고 나서야 나중에 프로시져가 호출되죠.
즉 예약이 되는 것입니다. 메시지 처럼...
왜냐면 동시에 두군데를 실행할 수 없거든요. 컴 구조가... 듀얼CPU를 지원하는 컴과 OS에서
가능한 부분도 있지만...
때문에 함수를 나가게 되면 send는 뮤효화 되죠... 사라지니까... 그래서 값으로 전달하면 괜찮습니다.
void test()
{
int send;
send = 100;
AfxBeginThread(ThreadProc, (void*)send);
} <--- 여기를 나간 후에 프로시져가 호출됨...
4바이트 이상일 경우 – 문자열 같은 경우
건네주리려는 데이터가 그 함수내에서만 유효하다면 값을 잃을 수 있습니다.
때문에 new나 malloc로 할당해준 다음 스레드에서 받은다움 처리후 삭제(delete, free)를
해주고요.
(예)
CString
CString* lpStr = new CString();
이렇게 하면 문자열 넣을때
lpSpr = \"뭐뭐뭐\"; 이게 안되겠죠.
그러니 아래와 같이 해주세요.
CString* lpStr;
CString str;
str = \"aaaaaa\";
str로 작업을 쭈욱 합니다.
그런다음 건내줄때
lpStr = new CString(str);
AfxBeginThread(ThreadProc, lpStr);
받은 곳에서는 앞에서 new로 할당했으니까 사용 후 delete 해줘야 겠죠.
UINT ThreadProc(LPVOID pParam)
{
CString lpStr = (CString*)pParam;
:
:
delete lpStr;
}
포인터는 4바이트이므로 4바이트보다 작거나 같은 크기의 변수는
그냥 그 값 자체를 넘겨도 됩니다.
CString 처럼 객체나 구조체 등 크기가 큰 것은 포인터로 넘기구요.
int send;
send = 100;
AfxBeginThread(ThreadProc, (void*)send);
이런식으로 그냥 100을 날리세요.
AfxBeginThread 함수는 바로
ThreadProc 스레드 프로시져를 호출하지는 않습니다.
AfxBeginThread 를 호출한 함수가 끝나고 나서야 나중에 프로시져가 호출되죠.
즉 예약이 되는 것입니다. 메시지 처럼...
왜냐면 동시에 두군데를 실행할 수 없거든요. 컴 구조가... 듀얼CPU를 지원하는 컴과 OS에서
가능한 부분도 있지만...
때문에 함수를 나가게 되면 send는 뮤효화 되죠... 사라지니까... 그래서 값으로 전달하면 괜찮습니다.
void test()
{
int send;
send = 100;
AfxBeginThread(ThreadProc, (void*)send);
} <--- 여기를 나간 후에 프로시져가 호출됨...
4바이트 이상일 경우 – 문자열 같은 경우
건네주리려는 데이터가 그 함수내에서만 유효하다면 값을 잃을 수 있습니다.
때문에 new나 malloc로 할당해준 다음 스레드에서 받은다움 처리후 삭제(delete, free)를
해주고요.
(예)
CString
CString* lpStr = new CString();
이렇게 하면 문자열 넣을때
lpSpr = \"뭐뭐뭐\"; 이게 안되겠죠.
그러니 아래와 같이 해주세요.
CString* lpStr;
CString str;
str = \"aaaaaa\";
str로 작업을 쭈욱 합니다.
그런다음 건내줄때
lpStr = new CString(str);
AfxBeginThread(ThreadProc, lpStr);
받은 곳에서는 앞에서 new로 할당했으니까 사용 후 delete 해줘야 겠죠.
UINT ThreadProc(LPVOID pParam)
{
CString lpStr = (CString*)pParam;
:
:
delete lpStr;
}