메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

C/C++/MFC
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;

}