win32 CreateThread,如何将lpStartAddress参数作为c ++类函数调用?

时间:2011-05-07 14:25:52

标签: c++ winapi class function-pointers

我正在阅读这里讨论我的问题的主题:

how to use CreateThread for functions which are class members

使用微软网站的代码后:
How to spawn console processes with redirected standard handles
我实现了这个解决方案,但有一些问题,如:

我需要在

中使用lpvThreadParam参数
DWORD WINAPI GetAndSendInputThread(LPVOID lpvThreadParam) 

我如何在RichieHindle建议的示例中实现这一点?在ThreadStart函数中?
还有bRunThread和hStdIn中的参数(来自微软的例子我在构造函数上用值启动它们但是当我从微软的例子中执行带有GetAndSendInputThread内容的ThreadStart时,它会断言值永远不会被设置。
我希望我很清楚,基本上我喜欢能够将这个例子作为c ++类来运行。

2 个答案:

答案 0 :(得分:2)

确定。我想我现在知道你要去哪里了。这样的事情怎么样?在类构造函数中创建管道,然后在类线程函数中使用hInputWrite句柄(从静态线程函数调用。

class MyClass
{
    HANDLE hInputWrite;
    HANDLE hInputRead;
    SECURITY_ATTRIBUTES sa;

    MyClass() {
       if (!CreatePipe(&hOutputReadTmp,&hOutputWrite,&sa,0))
          DisplayError("CreatePipe");
    }

    static DWORD WINAPI StaticThreadStart(void* Param)
    {
        MyClass* This = (MyClass*) Param;
        return This->ThreadStart();
    }

    DWORD ThreadStart(void)
    {
        // Do stuff with hInputWrite handle here
    }

    void startMyThread()
    {
       DWORD ThreadID;
       CreateThread(NULL, 0, StaticThreadStart, (void*) this, 0, &ThreadID);
    }
};

MyClass thread;
thread.startMyThread();

(由RichieHindles answer修改)

答案 1 :(得分:1)

只需更改StaticThreadStart即可将收到的指针传递给真实方法。

NB。如果您使用的是C或C ++标准库,那么您应该从MS扩展到C运行时使用beginthread or beginthreadex,这些确保为新线程正确初始化C / C ++库。