1

那里有很多例子,但我似乎无法找出解决问题的方法。我有

class FooSource{
    ...

    void StartGetFoos(void (*callback)(vector<IFoo*>*, IAsyncResult));
    ...
}

StartGetFoos()被调用时,它完成了获取 Foos 的请求,保存回调。当请求完成时(大约需要 30 秒),将调用保存的回调并返回结果。 我无法更改此方法的签名。

在别的地方我有课

class FooUser {
    ...

    void FooUser::MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }

    void init()
    {
         fooUser->StartGetFoos(??????);
         // how do I pass my callback member function here?
    }
}
4

2 回答 2

3

签名上没有地方可以让void (*callback)(vector<IFoo*>*, IAsyncResult)您接收this指针,因此您不能使用成员函数。相反,您必须使用static成员函数:

class FooUser {
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }

    void init()
    {
         fooUser->StartGetFoos(&FooUser::MyCallback);
    }
};

这里的问题是您将无法访问 ; 上的任何实例数据FooUser。这可能是也可能不是问题。

根据 API 的设计程度,可能有一种方法可以传递实例指针,例如通过IAsyncResult result.

于 2012-06-25T21:28:25.133 回答
2

如果 IAsyncResult 是一个传入的数据结构,然后再次返回以进行操作,您可以使用自己的信息对其进行扩展。

class MyAsyncResult : public IAsyncResult
{
public:
   MyAsyncResult(FoorUser *sender) : sender(sender){}
   FooUser *sender;
};

然后,正如 ecatmur 所说,您可以为回调指定一个静态成员函数,但您也可以创建一个常规成员函数,以便在后面调用:

静态成员函数无法访问类成员,但可以在通常需要普通 C 函数的情况下指定为回调。

class FooUser
{
    // static with no access to class members, but can be specified as a callback.
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          MyAsyncResult *res = (MyAsyncResult*)result;
          res->sender->MyCallback(foos, result);
    }

    void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          // handle the actual callback here
    }

    void init()
    {
         IAsyncResult *res = new MyAsyncResult(this);
         fooUser->StartGetFoos(&foos, res);
    }
}
于 2012-06-25T21:55:34.543 回答