|
안녕하세요..
쓰레드함수로 구조체를 넘겨서 사용하는 문제와 연장선상에 있는 질문이 아닌가 싶은데요.
쓰레드함수로 넘겨준 구조체를 가지고있는 리스트를 하나 만들어서 그것을 이용하면 어떨까 합니다.
제가 쓰던 소스의 일부를 올려볼께요.. 도움이 될려나 몰겠습니다. ㅡㅡ;
허접스러워도 양해 바랄께요..
쓰레드 동기화객체 부분은 소스에서 빠진부분도 있으니 양해바랍니다..
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);
}
유창환 님이 쓰신 글 :
: 음.
: 왜 주소를 넘기시려고 하시는지 이해가 되질 않습니다.
: 쓰레드라는건 어차피 같은 메모리를 쓰기 때문에 메모리 주소를 넘길 필요가 없을것 같습니다.
: 차라리 메모리 번지의 인덱스(몇번째의 메모리를 읽어야 하나)를 넘기시고 그 번지로 찾아가서
: 메모리의 값을 이용하시는게 좋을듯 싶습니다.
: 참고가 되셨으면.
:
: 차라리 포인터
: 수야 님이 쓰신 글 :
: : 아무리 생각해도 저로써는 생각해낼수가 없군요..
: :
: : ㅡ_ㅡ 답답하기만할뿐입니다.
: :
: : 그래서 생각해낸게 아래질문입니다.
: :
: : 해당영역을 메모리로 잡고 메모리 주소를 넘겨서 그 주소를 사용하는 방법..
: :
: : 구현도 어렵네요 ㅡ_ㅡ
: :
: : 그래서 생각합니다...
: :
: : 스레드가 값을 리턴할수 있는 방법.... 있나요?
: :
: : 방법좀... ㅠ_ㅠ
|