当我要使用一个类,而该类自己创建了一个线程时,在线程中使用其它类成员,我以前只知道一种方法,就是CreateThread()函数的第四个参数指定为this,比如像这样:在EventSever类的一个函数中创建线程:
类声明:class EventSever
{
//......省略
protected:
static DWORD WINAPI MainWorkThread(LPVOID lpParam);
         int InsertSocketOBJ();
};实现: m_hlMainSockThread = CreateThread
(
NULL,
NULL,
MainWorkThread,
this,
0,
&m_hlMainSockThreadID
);
然后在线程中对传递进来的消息进行重解释:DWORD WINAPI EventSever::MainWorkThread(LPVOID lpParam)
{
EventSever *InP = reinterpret_cast<EventSever*>(lpParam);
         //调用其它类成员或函数
         Inp->InsertSocketOBJ();
         //......(省略)
return 0;
}这样使用指针Inp就可以指向EventSever类中的其它成员了。但是现在在学习其它代码的时候遇到一种新的创建情况,它是这样创建的: ThreadOBJ->hlThread = CreateThread(NULL, 0, ChildThread, (LPVOID)ThreadOBJ, 0, NULL);其中ThreadOBJ是某个结构体的指针;然后在新线程中进行了这样的重解释:DWORD WINAPI EventSever::ChildThread(LPVOID lpParam)
{
//这里把任何传递过来的消息都解释为Thead_OBJ指针,那如何传递非该内容的消息?
//如果要使用外部的类函数,该怎么处理?
Thead_OBJ *Thread = (Thead_OBJ*)lpParam;
         //......省略
return 0;
}
由于原来的范例代码是一个控制台程序,没有类,其它调用的函数都是静态的,因此不存在这种重解释的调用问题;
请问如果我想将它封装到一个类中,这样的写法该怎样改动才能成功调用其它的类函数?请各位达人不吝指教

解决方案 »

  1.   

    不清楚你的ThreadOBJ是什么,和你所说的外部类有什么关联?
      

  2.   

    LPVOID lpParam只不过是线程一参数而已,至于想传什么样的参数用户自己定义,一个原则:
    CreateThread的时候传什么样的类型参数进去,在线程执行函数中就要把lpParam强制转换成什么
      

  3.   


    那个指针其实是这样一个结构struct Thead_OBJ
    {
    Socket_OBJ *SocketList; // Linked list of all sockets allocated
    Socket_OBJ *SocketListEnd; // End of socket list
    int SocketCount; // Number of socket objects in list
    HANDLE hlEvent; // Used to signal new clients assigned
    HANDLE hlThread;
    HANDLE SockHandle[MAXIMUM_WAIT_OBJECTS];// Array of socket's event handles
    CRITICAL_SECTION ThreadCS; // Protect access to SOCKET_OBJ lists
    Thead_OBJ *Next; // Next thread object in list
    };
    是什么结构其实不是关键,问题是目前在范例代码中我看到了很多类似的线程创建方式,这样的话,我就不清楚怎么调用其它类成员函数了;比如第一个例子里,我可以在使用:EventSever *InP = reinterpret_cast<EventSever*>(lpParam);进行重解释之后,使用Inp指针指向所有其它类成员;
    但是后一个例子,我该怎么调用呢?
    比如调用那个InsertSocketOBJ()函数,难道在线程中这样写吗?
    Thread->InsertSocketOBJ();
    这样好像不对啊……
      

  4.   


    请教一下,如果像这样创建了线程:ThreadOBJ->hlThread = CreateThread(NULL, 0, ChildThread, (LPVOID)ThreadOBJ, 0, NULL);因为第四个参数我不好改(因为对代码尚不了解,也不会改);
    那么在这个线程里我有什么其它办法获得类指针吗?
      

  5.   


    谢谢是的,我也知道第四个参数如果改成this,那么该类的成员就可以随便调用了;
    但问题是这里的代码我不方便修改此处;
    因为后面子线程的代码里将传递进来的消息这样解释之后:Thead_OBJ *Thread = (Thead_OBJ*)lpParam;用它进行了很多处理,至少从代码上来看是没办法简单替换成类指针的。
    那么这样的话,我有没有办法获得类指针呢?