C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[10212] Re:Re:스레드에서 값을 리턴하는 방법?
james [] 1489 읽음    2001-08-23 00:03
안녕하세요..

쓰레드함수로 구조체를 넘겨서 사용하는 문제와 연장선상에 있는 질문이 아닌가 싶은데요.
쓰레드함수로 넘겨준 구조체를 가지고있는 리스트를 하나 만들어서 그것을 이용하면 어떨까 합니다.

제가 쓰던 소스의 일부를 올려볼께요.. 도움이 될려나 몰겠습니다. ㅡㅡ;
허접스러워도 양해 바랄께요..

쓰레드 동기화객체 부분은 소스에서 빠진부분도 있으니 양해바랍니다..

typedef struct _USERINFO
{
    BYTE        nMsg;
    BYTE        nMode;
    SOCKET        hSocket;
    SOCKADDR_IN    RemoteAddr;
    SYSTEMTIME    ConnectTime;

} USERINFO;
// 쓰레드 함수
DWORD WINAPI ListenThread(void* pData);
DWORD WINAPI UserThread(void* pData);
// 사용자 정의 함수
void InitUserList();
void FreeUserList();
void IncUserList(USERINFO* pInfo);
void DecUserList(USERINFO* pInfo);

DWORD WINAPI ListenThread(void* pData)
{
    USERINFO* pUserInfo;
    HANDLE hUserThread;
         InitUserList();  // 사용자 구조체 초기화 함수

   
    while (1) {
        pUserInfo = new USERINFO;
        pUserInfo->nMsg = 0;
        pUserInfo->nMode = 0;
        pUserInfo->hSocket = accept(g_hListenSocket,
            (LPSOCKADDR)&pUserInfo->RemoteAddr, &nLen);
       
   
        hUserThread = CreateThread(NULL, 0, UserThread, pUserInfo, 0, &dwThreadID);
        ...........
        ...........
}


DWORD WINAPI UserThread(void* pData)
{
    USERINFO* pUserInfo;
   
        pUserInfo = (USERINFO*)pData;
        IncUserList(pUserInfo);   //사용자 구조체 리스트에 추가.

        ......

        .....

}
//-----------------------------------------------------------------------------
void InitUserList()   //리스트 조기화 함수.
{
    g_pUserList = new CList();
    InitializeCriticalSection(&g_hCriticalUsers);
    g_hNoUserEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
}
//-----------------------------------------------------------------------------

void FreeUserList()   // 리스트 해제
{
    DeleteCriticalSection(&g_hCriticalUsers);
    CloseHandle(g_hNoUserEvent);
    delete g_pUserList;
}
//-----------------------------------------------------------------------------

void IncUserList(USERINFO* pInfo)   // 리스트에 구조체 추가
{
    EnterCriticalSection(&g_hCriticalUsers);
    g_pUserList->Add(pInfo);
    LeaveCriticalSection(&g_hCriticalUsers);
    ResetEvent(g_hNoUserEvent);
}
//-----------------------------------------------------------------------------
void DecUserList(USERINFO* pInfo)  //리스트에서 구조체 삭제.
{
    USERINFO* pInfo2;
    ULONG i, nRet;

    EnterCriticalSection(&g_hCriticalUsers);
    nRet = -1;
    for (i = 0; i < g_pUserList->GetCount(); i++) {
        pInfo2 = (USERINFO*)g_pUserList->GetData(i);
        if (pInfo == pInfo2) {
            nRet = i;
            break;
        }
    }
    delete pInfo;
    g_pUserList->Delete(nRet);
    LeaveCriticalSection(&g_hCriticalUsers);

    if (g_pUserList->GetCount() < 1)
        SetEvent(g_hNoUserEvent);
}


유창환 님이 쓰신 글 :
: 음.
: 왜 주소를 넘기시려고 하시는지 이해가 되질 않습니다.
: 쓰레드라는건 어차피 같은 메모리를 쓰기 때문에 메모리 주소를 넘길 필요가 없을것 같습니다.
: 차라리 메모리 번지의 인덱스(몇번째의 메모리를 읽어야 하나)를 넘기시고 그 번지로 찾아가서
: 메모리의 값을 이용하시는게 좋을듯 싶습니다.
: 참고가 되셨으면.
:
: 차라리 포인터
: 수야 님이 쓰신 글 :
: : 아무리 생각해도 저로써는 생각해낼수가 없군요..
: :
: : ㅡ_ㅡ 답답하기만할뿐입니다.
: :
: : 그래서 생각해낸게 아래질문입니다.
: :
: : 해당영역을 메모리로 잡고 메모리 주소를 넘겨서 그 주소를 사용하는 방법..
: :
: : 구현도 어렵네요 ㅡ_ㅡ
: :
: : 그래서 생각합니다...
: :
: : 스레드가 값을 리턴할수 있는 방법.... 있나요?
: :
: : 방법좀... ㅠ_ㅠ

+ -

관련 글 리스트
10180 스레드에서 값을 리턴하는 방법? 수야 922 2001/08/22
10187     Re:스레드에서 값을 리턴하는 방법? 유창환 1189 2001/08/22
10212         Re:Re:스레드에서 값을 리턴하는 방법? james 1489 2001/08/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.