C++Builder2009에서 포인터를 void*에서 TMemo*로 올바르게 다운캐스트하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/274841

문제

저는 C++Builder 2009에서 멀티스레드 소켓 채팅을 작성하고 있습니다.
해야 할 작업에 따라 거의 완료되었지만 약간의 문제가 있습니다.TMemo* 포인터를 void*로 업캐스트하는 CreateThread WinAPI 함수에 전달해야 합니다.

나는 이런 식으로 시도했습니다 :

HANDLE xxx = MemoChat->Handle;
hNetThread = CreateThread(NULL, 0, NetThread, xxx, 0, &dwNetThreadId);
//...

그런 다음 NetThread 함수에서

TMemo* MyMemo((HANDLE)lpParam);
TMemo* MyMemo((TMemo*)lpParam);

하지만 작동하지 않았습니다.:(

문제는 이 새 스레드에서 내 메모 구성 요소를 사용할 수 있도록 어떻게 올바르게 다운캐스트할 수 있느냐는 것입니다.

도움이 되었습니까?

해결책

부르다:

TMemo*     MemoChat   = // You defined that somewhere I assume
HANDLE     hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId);

여기서 일어나고있는 것은 세 번째 매개 변수로 전달한 포인터가 무효 포인터 (또는 Winterms LPVoid)로 자동 변환되고 있다는 것입니다. 그것은 그것을 바꾸지 않는 것이 좋습니다. 그것은 시스템이 당신의 객체에 대해 아무것도 모르기 때문에 유형 정보를 잃어 버립니다.

새 스레드 시작점 :

DWORD NetThread(LPVOID lpParameter)
{
    TMemo*   MemoChat   = reinterpret_cast<TMemo*>(lpParameter);
    // Do your thread stuff here.
}

스레드 시작 메소드가 호출되면. void 포인터를 올바른 유형으로 다시 변환하면 다시 사용을 시작할 수 있어야합니다.

다른 오해를 해결하기 위해.

핸들은 포인터입니다.
그리고 당신은 그것을 netthread ()로 매개 변수로 전달할 수있었습니다.

핸들은 사용중인 객체를 가리키는 시스템 제어에서 포인터에 대한 포인터입니다. 그래서 왜 이중 간접입니다. 시스템은 객체의 모든 소유자를 찾지 않고 객체를 이동하고 포인터를 업데이트 할 수 있습니다. 소유자는 모두 방금 업데이트 된 포인터에서 그 지점을 처리합니다.

주요 메모리를 보조 스토리지로 바꾸는 OS/하드웨어 기능으로 인해 현대 컴퓨터에서 드물게 사용되는 구식 컴퓨터 과학 개념입니다. 그러나 특정 자원의 경우 여전히 유용합니다. 요즘 핸들이 필요한 경우 사용자로부터 멀리 떨어진 객체 내부에 숨겨져 있습니다.

다른 팁

HANDLE은 다음과 같습니다. ~ 아니다 포인터이지만 Win32 API의 개념입니다.따라서 첫 번째 줄은 LPVOID를 HANDLE로 캐스팅합니다. 이는 스레드 루틴의 매개변수가 실제로 핸들(xxx)로 제공되므로 정확합니다.그러나 그런 다음 계속해서 HANDLE을 MyMemo 개체로 변환합니다.이는 핸들의 비트가 주소를 형성하는 것처럼 처리하지만 그렇지 않습니다.

두 번째 줄은 정확히 동일한 변환을 수행합니다. 핸들을 직접 포인터인 것처럼 처리합니다.

왜 MemoChat 자체를 스레드에 전달하지 않는지 궁금합니다.

hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId);

Martin이 정확히 옳다고 생각하지 않기 때문에 손잡이 대 포인터를 설명하고 명확히하는 것이 더 중요합니다.

"포인터에 대한 포인터"는 실제로 핸들이라고 불리며, 운영 체제가 응용 프로그램 계층에 대한 명시 적 지식없이 힙합 메모리 블록을 물리적으로 움직일 수있는 일반적인 CS 접근법입니다. 클래식 68K MAC OS는 이런 방식으로 작동합니다. 이러한 방식으로 작동하는 OS'es는 일반적으로 사용자 코드가 핸들을 통해 메모리를 할당하고 힙을 직접 벗어날 수 있습니다. 이 접근법은 적절한 메모리 관리 하드웨어가없는 기계에 사용됩니다.

그러나 이전 사용의 일부 추상화를 빌리는 단어 핸들의 다른 용도가 있지만 다른 구현이 있습니다. 불투명 포인터 (사용자가 지식이없는 데이터 구조에 대한 포인터 - PIMPL 관용구)도 일반적으로 핸들이라고합니다.

또한 핸들이라는 용어는 단순히 객체에 대한 "참조"를 나타내는 데 사용될 수 있습니다. UNIX 파일 핸들 (= 파일 설명자)이 좋은 예입니다. stdin = 0, stdout = 1, ...

그렇다면 위의 Windows API 핸들은 무엇입니까? 상충되는 보고서를 보았습니다. 이 문서 말 :

Win32의 핸들은 리소스 또는 창을 식별하는 데 사용되는 숫자입니다. 그들은 포인터 나 포인터가 아닙니다. 그것들을 ID 번호로 생각하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top