【问题标题】:VC++ Winforms passing member function as argument to BackgroundWorkerVC++ Winforms将成员函数作为参数传递给BackgroundWorker
【发布时间】:2015-03-16 23:00:23
【问题描述】:

作为初学者,我正在为这里的语法而苦苦挣扎。 我正在制作一个通用的 BackgroundWorker,以避免为我的应用程序中的许多任务中的每一个制作单独的工作人员。 我无法弄清楚如何将成员函数传递给 RunWorkerAsync()

这是我的 DoWork 方法的代码:

private: System::Void backgroundWorker2_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    Func<int> ^func = (Func<int>^)e->Argument;
    e->Result = func();
}

假设我想让 BG worker 运行一个名为 myfunc 的函数。 我想做这样的事情:RunWorkerAsync(myfunc)

虽然 myfunc 是同一类的成员,即 Form1

【问题讨论】:

  • 如果是c#,可以扩展eventHandler

标签: .net winforms visual-c++ backgroundworker


【解决方案1】:

我不清楚挂断可能是什么,创建 Func 的语法与您订阅 DoWork 事件的方式没有太大不同。所以只是一些示例代码:

ref class Example {
    BackgroundWorker^ worker;
    void OnDoWork(System::Object ^sender, System::ComponentModel::DoWorkEventArgs ^e) {
        auto job = safe_cast<Func<int>^>(e->Argument);
        e->Result = job();
    }
    int myfunc() {
        return 42;
    }
public:
    Example() : worker(gcnew BackgroundWorker) {
        worker->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &Example::OnDoWork);
        auto job = gcnew Func<int>(this, &Example::myfunc);
        worker->RunWorkerAsync(job);
    }
};

【讨论】:

  • 但是还有没有办法概括函数的类型?我的意思是,如果我想调用一个返回 String^ 而不是 int 的函数呢?
  • 那你用Func&lt;String^&gt;^代替。
猜你喜欢
  • 2019-09-27
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多