gpt4 book ai didi

C++11 在 Lambda 中捕获成员变量

转载 作者:太空狗 更新时间:2023-10-29 20:43:59 25 4
gpt4 key购买 nike

我有一个成员变量定义为:

HWND 窗口句柄。

我正在 try catch 变量并在 Lambda 中分配给它。所以编译器给了我一个警告,建议我捕获“this”。我做到了,但现在 Handle 仅在 Lambda 中有效:S 换句话说,它在 Lambda 之外为 NULL。

class Foo
{
private:
HWND WindowHandle;

public:
Foo();
void MakeWindow(.......);
HWND GetWindowHandle() {return WindowHandle;};
};

Foo::Foo(){}

Foo::MakeWindow(.......)
{
Thread = std::thread([ClassName, Title, Width, Height, this]{
WindowHandle = CreateWindowEx(0, ClassName.c_str(), Title.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, Width, Height, 0, 0, GetModuleHandle(NULL), 0);
if(WindowHandle)
{
ShowWindow(WindowHandle, SW_SHOWDEFAULT);
MSG msg;
while(GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
}
});
}


int main()
{
Foo F;
F.MakeWindow(........);
std::cout<<std::boolalpha<<(F.GetWindowHandle() == NULL); //writes true.
}

上面创建的窗口非常好!只是句柄为空。我怎样才能从 Lambda 中获取句柄给我的类(class)成员?

最佳答案

那是因为您的代码存在竞争条件。当您检查 main() 中的值时,线程尚未运行,因此 WindowHandle 仍为 NULL。

除非你还没有真正启动线程。在那种情况下,由于线程还没有执行,WindowHandle 仍然是 NULL。

无论如何,您需要使用互斥锁在线程之间同步对 WindowHandle 的访问。

关于C++11 在 Lambda 中捕获成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com