【问题标题】:win32 CreateThread ,how to call the lpStartAddress parameter as c++ class function?win32 CreateThread,如何将lpStartAddress参数调用为c++类函数?
【发布时间】:2011-05-07 14:25:52
【问题描述】:

我正在阅读讨论我的问题的线程:

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 中的参数(来自 microsoft 示例,我在构造函数上使用值启动它们,但是当我使用 microsoft 示例中的 GetAndSendInputThread 的内容执行 ThreadStart 时,它接缝的值永远不会设置。
我希望我很清楚,基本上我希望能够将这个示例作为 c++ 类运行。

【问题讨论】:

    标签: c++ winapi class function-pointers


    【解决方案1】:

    好的。我想我知道你现在要去哪里。这样的事情怎么样。在类构造函数中创建管道,然后在类线程函数中使用 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

    【讨论】:

      【解决方案2】:

      只需更改StaticThreadStart 以将它接收到的指针传递给真正的方法。

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

      【讨论】:

      • 只有在某些相对不寻常的情况下才需要使用 beginthread。通常,每个线程的 CRT 状态在线程进入时自动初始化。这是必要的,因为 CRT 用于许多不是由 BeginThread 创建的线程(例如线程池线程)。如果您已静态链接到 CRT(无论如何不推荐)并且您的二进制文件是 EXE 或带有 DisableThreadLibraryCalls 的 DLL,您只需要执行手动 beginthread 调用。一般建议:不要静态链接 CRT。
      • @Martyn:所以,当限制被取消时……很好。我想我应该每隔十年左右重新阅读一次我知道的 API 的文档 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多