【问题标题】:How to add a call to a non-static class member function to the threadpool?如何向线程池添加对非静态类成员函数的调用?
【发布时间】:2013-08-06 12:58:45
【问题描述】:

我正在为 C++/CLI 寻找这个 stackoverflow: How to get Windows thread pool to call class member function?: 我有一个带有成员函数的 ref 类(该函数的副本是静态的,用于测试目的):

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

从 main() 我可以轻松地将静态函数的调用添加到线程池:

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

但我不想调用静态函数(它或多或少是一个与对象无关的全局函数),我想为 CTest 类的几个实例调用成员函数testFunction()
我怎样才能做到这一点?

【问题讨论】:

    标签: callback c++-cli threadpool member-functions


    【解决方案1】:

    在 C++/CLI 中,您需要明确指定您希望委托调用函数的对象。

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

    【讨论】:

    • @David:this 不起作用,因为在 main() 中没有 this,但你让我走上了正轨,谢谢!!解决方案:CTest^ ctest01 = gcnew CTest; ThreadPool::QueueUserWorkItem (gcnew WaitCallback (ctest01, &CTest::testFunction));
    【解决方案2】:

    您不应该在 .NET 中使用线程池。您应该考虑使用System::Threading::Tasks。这是使用多个“任务”的更有效方式...

    还要注意 C#4.5 中新的“async”关键字。这很有帮助!所以你真的应该考虑将应用程序的 .NET 部分放入 C#...,并且只在 InterOp 场景中使用 C++/CLI。

    【讨论】:

    【解决方案3】:

    试试这个:

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

    WaitCallback(ctestCTest 的分配对象提供内存上下文 &CTest::testFunction)); 提供内存转移到testFunction 的实际分配函数内存地址。
    “动态”函数是“动态”类对象的一部分。
    因为垃圾收集器,这一定是这样的。

    【讨论】:

    • 您是否从 2 年前的答案中复制了我的评论?
    • 不!我刚遇到这个问题。我做了一个实验,成功后我把它贴在这里。我只看了答案,我没有看到你的评论。您可以将其发布为答案吗?我会删除我的答案吗?对不起。
    • 不,没关系,你可以保留你的。
    猜你喜欢
    • 2020-10-04
    • 2011-10-03
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多