2011-05-07 151 views
2

我读的线程谈论我的问题就在这里:win32 CreateThread,如何以C++类函数的形式调用lpStartAddress参数?

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(从微软的例子我启动他们的构造函数的值,但是当我执行ThreadStart与GetAndSendInputThread的内容从微软的例子,它接缝,值从未设置
我希望我是清楚的,基本上我希望能够运行这个例子是C++类。

回答

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

+0

谢谢谢谢谢谢谢谢! – user63898 2011-05-07 16:28:28

+0

很高兴! :d – ralphtheninja 2011-05-07 16:48:49

1

只要改变StaticThreadStart通过它接收到真正的方法指针。

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

+0

beginthread的使用只在某些需要进行修改通常情况下,每个线程的CRT状态在线程入口时被自动初始化,这是必要的,因为CRT在许多线程(如线程池线程)上使用,而非由BeginThread创建。如果你有静态链接到CRT(不推荐)*和*你的二进制文件是一个EXE或带有DisableThreadLibraryCalls的DLL。 一般建议:不要静态链接CRT。 – 2011-05-07 20:12:39

+0

@Martyn:当限制被删除时,它很好。我想我应该重新阅读我认识的API每十年左右的文档:-) – Richard 2011-05-08 07:10:30

相关问题