我有一个成员变量定义为:C++ 11 Capture成员变量在Lambda中
HWND WindowHandle。
我想捕获变量并在Lambda中赋值给它。所以编译器给了我一个警告,并建议我捕获“this”。我做了,但现在句柄只在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内的句柄到我的班级成员?
你是对的!我只是放了一个大的睡眠,事实证明它不是NULL。现在我必须深入Mutexes:l – Brandon
@CantChooseUsernames实际上,尽管互斥锁可以解决这个问题,但清理代码设计可能是一个更好的主意:在正常情况下,外部世界不应该要求诸如窗口句柄之类的信息。隔离依赖关系并且不向外部世界提供内部。当其他代码想要从窗口中获取某些内容时,让他们调用'Foo'上的方法而不是暴露窗口句柄。 –
@CantChooseUsernames互斥量非常容易,特别是当您使用RAII互斥锁时,比如'std :: lock_guard'(http://en.cppreference.com/w/cpp/thread/lock_guard),这有助于避免一些非常常见的导致死锁的新手错误。 –