2013-12-24 2 views
0

익숙하지 않은 winapi가 포함되어 있기 때문에 올바른 구문이 무엇인지 모르겠습니다. 예를 들어, processClient (LPVOID)에서 processClient (LPVOID &)까지 미리 정의 된 스레드 함수 매개 변수를 xhangethe하게하지 않을 것입니다.C++ - 참조로 CreateThread()에 객체 전달하기

"params"객체를 참조로 전달해야합니다 (스레드에서 "processClient()"에 값을 변경하지 않더라도 현재는 문제가 없습니다).

... struct(the object) declaration 
struct ClientParams{ 

    ClientParams::ClientParams():sock(INVALID_SOCKET), i(NULL){}; 

public: 
    SOCKET sock; 
    int i; 
}; 

... in processClient(LPVOID lpParam){ 
    SOCKET ClientSocket=(SOCKET)*lpParam->sock; ?? doesnt work 
    int i=*lpParam->i; ?? doesn't work 
} 
... in main{ 
ClientParams *params = new ClientParams(); 
params->i=some_value; 
params->sock=ClientSocket; 
CreateThread(
      NULL,      // don't inherit handle 
      0,       // use default size for the executable 
      processClient, 
      (LPVOID)params,    // thread data 
      0,       // run right away 
      &i); 
} 
+0

그래서 그냥 당신이 필요로 포인터를 전달 내부 같은 포인터로 변환, 나는 편의를 위해 대신'표준 : thread'을 사용하는 것이 좋습니다,하지만 이미 포인터입니다. – chris

+0

'SOCKET ClientSocket = ((ClientParams *) lpParam) -> sock;'- 기본 C++. 다중 스레드 네트워킹 응용 프로그램이 첫 번째 프로젝트에 가장 적합하지 않을 수도 있습니다. – IInspectable

+0

@IInspectable, 당신은 무효 포인터를 dereferencing하고 있습니다. 어쨌든, 당신은 C를 의미합니다. ++는 void 포인터보다 더 좋은 방법이 있습니다. – chris

답변

2

SOCKET ClientSocket = (SOCKET) * lpParam-를> 양말; ?? 당신이 '와 함께 역 참조 어떤 사업을하지 않아도 나던 작업

lpParam은 *, 그것은'PARAMS '장소를'* ClientParams '유형, 주, 그것은을 통과 때했던 것과 같은 값을 가진다 '. 나머지는 단지 우선 순위 문제입니다. 그것은이어야합니다

SOCKET ClientSocket=((ClientParams*)lpParam)->sock; 
+0

고마워요! winapi의 void 매개 변수가 나를 혼란스럽게 만들었습니다. –

0

액세스 구조 구성원은 구조를 통과해야합니다.

SOCKET ClientSocket=((ClientParams*)lpParam)->sock;