我正在 C++Builder 2009 中编写多线程套接字聊天。
按照我需要做的,它几乎完成了,但我有一个小问题。
我需要将 TMemo* 指针传递给 CreateThread WinAPI 函数,该函数将其向上转换为 void*。
我尝试过这种方式:
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);
这里发生的情况是,作为第三个参数传递的任何指针都会自动转换为 void 指针(或在 WinTerms LPVOID 中)。没关系,它不会改变它,它只是丢失了类型信息,因为系统不知道有关您的对象的任何信息。
新的线程起点:
DWORD NetThread(LPVOID lpParameter)
{
TMemo* MemoChat = reinterpret_cast<TMemo*>(lpParameter);
// Do your thread stuff here.
}
一旦调用线程启动方法。只需将 void 指针转换回正确的类型,您就可以再次开始使用它。
只是为了消除其他误解。
HANDLE 是一个指针。
您可以将其作为参数传递给 NetThread()。
句柄是一个在系统控制下指向您正在使用的对象的指针。那么为什么要使用双重间接呢?它允许系统移动对象(并更新其指针),而无需找到对象的所有所有者。所有者都有指向刚刚更新的指针的句柄。
这是一个老式的计算机科学概念,由于操作系统/硬件能够将主内存交换到辅助存储,因此在现代计算机中很少使用。但对于某些资源它们仍然有用。如今,当需要 handle 时,它们被隐藏在远离用户的物体内部。
关于c++ - 在 C++Builder2009 中如何正确地将指针从 void* 向下转换为 TMemo*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274841/