Question

I'm looking for this stackoverflow: How to get Windows thread pool to call class member function? for C++/CLI: I have a ref class with a member function (a copy of that function is static for testing purposes):

ref class CTest
{
public:
  static void testFuncStatic( System::Object^ stateInfo )
  {
    // do work;
  }
  void testFunction( System::Object^ stateInfo )
  {
    // do work;
  }
};

From main() I can easily add a call to the static function to the threadpool:

System::Threading::ThreadPool::QueueUserWorkItem (gcnew System::Threading::WaitCallback (&CTest::testFuncStatic));

But I don't want to call the static function (which is more or less an object-independent global function), I want to call the member function testFunction() for several instances of the class CTest.
How can I achieve that?

Was it helpful?

Solution

In C++/CLI, you need to explicitly specify the object you want the delegate to call the function on.

ThreadPool::QueueUserWorkItem(gcnew WaitCallback(this, &CTest::testFunction));
                                                 ^^^^

OTHER TIPS

You should not use thread pools in .NET. You should consider to use System::Threading::Tasks. This is an even more efficient way to use multiple "Tasks"...

Also be aware of the new "async" keyword in C#4.5. This helps a lot! So you should really consider to put the .NET part of your application into C#... and only use C++/CLI for InterOp scenarios.

Try this:

CTest ^ ctest = gcnew CTest;
ThreadPool::QueueUserWorkItem(gcnew WaitCallback(ctest, &CTest::testFunction));
                                                 ^^^^^

WaitCallback(ctest provides memory context to allocated object of CTest &CTest::testFunction)); provides memory shift to actual allocated function memory address of testFunction.
'Dynamic' functions are part of 'dynamic' class object.
This must be like that because of garbage collector.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top