一些代码:
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++ 中,你必须了解所有引用的生命周期并指向 thibgs。
PostMessage 是异步的(它在调用期间不会计算),因此在处理消息时您的指针可能有效也可能无效。
实际上如何正确地做到这一点需要比您分享的更多信息。 它可能需要比您更多的背景知识,因为您将 std 函数称为 lambda(反之亦然)。
想象一下,有人询问如何订购汉堡,但他们一直将服装称为“汽车”,并假设衬衫可以在高速公路上行驶。 差距太大了