通过 lParam 将函数指针传递给消息处理程序是否安全?

问题描述 投票:0回答:1

一些代码:

LRESULT CScopeFrame::OnDATACallback(WPARAM wParam, LPARAM lParam)
{
    std::function<void()>* callbackPtr = reinterpret_cast<std::function<void()>*>(lParam);

    if (callbackPtr && *callbackPtr)
    {
        (*callbackPtr)();
    }

    return 0;
}
    void sendCallbackMessage(CWnd* pWnd) const
    {
        if (callBackType == CALLMESSAGE && callbackNoParam)
        {
            if (pWnd != nullptr)
            {
                // Post the callback function address via LPARAM
                pWnd->PostMessage(WM_USER_ON_DATA_CALLBACK, 0, reinterpret_cast<LPARAM>(&callbackNoParam));
            }
        }
    }

    void sendCallbackMessage() const
    {
        if (callBackType == CALLMESSAGE && callbackNoParam)
        {
            CWnd* pWnd = AfxGetMainWnd();  // Get the main window pointer
            if (pWnd != nullptr)
            {
                // Post the callback function address via LPARAM
                pWnd->PostMessage(WM_USER_ON_DATA_CALLBACK, 0, reinterpret_cast<LPARAM>(&callbackNoParam));
            }
        }
    }
    void triggerSendMessage() const
    {
        if (asyncCallBack)
        {
            CWnd* pWnd = AfxGetMainWnd();  // Get the main window pointer
            //std::sync should use system threead pool minimazing overhead.
            std::async(std::launch::async, [this, pWnd]()
                {
                    sendCallbackMessage(pWnd);
                });
        }
        else
        {
            sendCallbackMessage();
        }
    };

哪里

std::function<void()> callbackNoParam;

要调用的函数是通过 lambda 调用的 UI 类方法:

hwData->addOrGetData<int>(sensorNames::BATTERY, [this]() {this->Update(); }, DATA<int>::CALLMESSAGE, true);
    template <typename T> std::shared_ptr<DATA<T>> addOrGetData(const std::string& name,
        std::function<void()> callback,
        typename DATA<T>::CALLBACKTYPE callBackType = DATA<T>::CALLONCHANGE,
        bool asyncCallBack = true)

此方法将回调添加到回调向量中。这个 lambda 安全吗?

它按预期工作,但我的问题是 - 它安全且正确吗?

我的经验有限(我没有接触过MFC, Windows 15 年了)而 C++ 不是我精通的语言。

c++ windows lambda mfc
1个回答
0
投票

不,这看起来很糟糕。

在 C++ 中,你必须了解所有引用的生命周期并指向 thibgs。

PostMessage 是异步的(它在调用期间不会计算),因此在处理消息时您的指针可能有效也可能无效。

实际上如何正确地做到这一点需要比您分享的更多信息。 它可能需要比您更多的背景知识,因为您将 std 函数称为 lambda(反之亦然)。

想象一下,有人询问如何订购汉堡,但他们一直将服装称为“汽车”,并假设衬衫可以在高速公路上行驶。 差距太大了

© www.soinside.com 2019 - 2024. All rights reserved.