C++ 中的回调

Callback in C++

提问人:DNRN 提问时间:7/6/2023 更新时间:7/6/2023 访问量:82

问:

我正在处理一个wasm项目,我需要在C++头文件中定义一个empscripten获取回调,因为我需要更新成员变量。 有人可以帮我如何定义 C++ 的回调函数,我能够在其中更新本地成员变量吗?

在MyClass.CPP中,我有以下方法

void MyClass::Register()
{
    emscripten_fetch_attr_t attr;
    emscripten_fetch_attr_init(&attr);
    attr.onsuccess = DownloadSucceeded;
    attr.onerror = DownloadFailed;
}

我已经在我的头文件中定义了 和。DownloadSucceededDownloadFailed

void DownloadSucceeded(emscripten_fetch_t* fetch)
{
    printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
    emscripten_fetch_close(fetch); // Free data associated with the fetch.
    m_unlocked = true;
}

void DownloadFailed(emscripten_fetch_t* fetch)
{
    printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
    emscripten_fetch_close(fetch); // Also free data on failure.
    m_unlocked = false;
}

我收到以下异常:

reference to non-static member function must be called

从上面的异常中,我试图发送参考,但这似乎也不起作用。如果某个聪明的人能解释为什么以及如何解决这个问题,我将不胜感激!

我幼稚的参考示例也不起作用:

attr.onsuccess = &DetectorBridge::DownloadSucceeded;

给:

assigning to 'void (*)(struct emscripten_fetch_t *)' from incompatible type 'void (mynamespace::MyClass::*)(emscripten_fetch_t *)'
C++ callback emscripten

评论

0赞 273K 7/6/2023
@john吧?它有成员。void *userData
0赞 john 7/6/2023
@273K 是的,我现在意识到了这一点。它愚弄了我,因为通常的做法是将用户数据指针直接放在回调签名中。我检查了 emscriptem 源并意识到我的错误。
0赞 DNRN 7/6/2023
不。我只是试图从回调中更新。不确定您从哪里得到我的问题?m_locked*void userData
0赞 john 7/6/2023
@DNRN是解决您问题的方法。userData
0赞 n. m. could be an AI 7/6/2023
emscripten需要 C 样式的回调。不能将非静态成员函数作为 C 样式回调传递。

答:

1赞 john 7/6/2023 #1

查看 emscriptem 源,您似乎需要做这样的事情,您将指针保存到 emscriptem 为此目的设计的字段。MyClass

void MyClass::Register()
{
    emscripten_fetch_attr_t attr;
    emscripten_fetch_attr_init(&attr);
    attr.onsuccess = DownloadSucceeded;
    attr.onerror = DownloadFailed;
    attr.userData = this; // save this object
}

然后,当您收到回调时,使用保存的指针来修改变量

void DownloadSucceeded(emscripten_fetch_t* fetch)
{
    printf("Finished downloading %llu bytes from URL %s.\n", 
        fetch->numBytes, fetch->url);
    static_cast<MyClass*>(fetch->userData)->m_unlocked = true; // get saved object
    emscripten_fetch_close(fetch); // Free data associated with the fetch.
}

我忽略了访问成员变量的问题,但如果这是一个问题,则有通常的解决方案。m_unlocked

评论

1赞 n. m. could be an AI 7/6/2023
您需要是静态成员或非成员函数。DownloadSucceeded