如何让Windows线程池调用类成员函数

How to get Windows thread pool to call class member function?

本文关键字:调用 成员 函数 线程 Windows      更新时间:2023-10-16

我希望Windows线程池(QueueUserWorkItem())调用我的类的成员函数。

不幸的是,这不能通过将成员函数指针作为参数传递给QueueUserWorkItem()来直接完成。

困难的是必须有多个可调用的成员函数,并且它们具有不同的签名(尽管都返回void)。

可能需要添加一些抽象层才能使其工作,但我不确定如何实现这一点。什么好主意吗?

这可能有帮助。您可以使用tr1::function()和tr1::bind来"合并"各种调用:

   #include <iostream>
   #include <tr1/functional>
   using namespace std;
   using namespace tr1;
   class A
   {
   public:
      void function(int i) { cout << "Called A::function with i=" << i << endl; }
   };
   void different_function(double c) {
       cout << "Called different_function with c=" << c << endl;
   }

   int main(int argc, char* argv[])
   {
      function<void()> f = bind(different_function, 3.14165);
      f();
      A a;
      f = bind(&A::function, a, 10);
      f();
      return 0;
   }

函数对象的地址可以作为单个可调用对象传递(只需要一个地址)。

示例:在你的课堂上添加:

char m_FuncToCall;
    static DWORD __stdcall myclass::ThreadStartRoutine(LPVOID myclassref)
    {
      myclass* _val =  (myclass*)myclassref;
      switch(m_FuncToCall)
      {
         case 0:
          _val->StartMyOperation();
         break;
       }
       return 0;
    }

创建用于添加到队列的成员,然后

void myclass::AddToQueue(char funcId)
 {
    m_FuncToCall=funcId;
   QueueUserWorkItem(ThreadStartRoutine,this,WT_EXECUTEDEFAULT);
 }

或创建

typedef void (*MY_FUNC)(void);
    typedef struct _ARGUMENT_TO_PASS
    {
     myclass* classref;
     MY_FUNC func;
    }ARGUMENT_TO_PASS;

然后

void myclass::AddToQueue(MY_FUNC func)
{
   ARGUMENT_TO_PASS _arg;
   _arg.func = func;
   _arg.classref = this;
    QueueUserWorkItem(ThreadStartRoutine,&_arg,WT_EXECUTEDEFAULT);
}

如果你需要进一步的解释,请随时问:)

EDIT:您需要更改第二个示例的ThreadStartRoutine你也可以改变结构体来保存传入参数