Как получить пул потоков Windows для вызова функции-члена класса? - PullRequest
2 голосов
/ 12 июля 2011

Я хочу, чтобы пул потоков Windows (QueueUserWorkItem ()) вызывал функции-члены моего класса.

К сожалению, этого нельзя сделать напрямую, передав указатель на функцию-член в качестве аргумента QueueUserWorkItem ().

Что делает это трудным, так это то, что более чем одна функция-член должна вызываться и они имеют разные подписи (хотя все возвращают void).

Возможно, потребуется добавить несколько уровней абстракции, чтобы получить этоработать, но я не уверен, как подойти к этому.Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Это может помочь. Вы можете использовать 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;
   }

Адрес объекта функции может быть передан как один вызываемый объект (требуется только один адрес).

0 голосов
/ 12 июля 2011

Пример: В вашем классе добавьте:

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);
}

Если вам нужны дополнительные объяснения, не стесняйтесь спрашивать:)

РЕДАКТИРОВАТЬ: Вам потребуется изменить ThreadStartRoutine для второго примера, а также вы можете изменитьструктура для хранения передаваемого аргумента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...