如何将“this”指针传递给 C++ WinAPI 线程?
Posted
技术标签:
【中文标题】如何将“this”指针传递给 C++ WinAPI 线程?【英文标题】:How to pass in the 'this' pointer to a C++ WinAPI thread? 【发布时间】:2020-06-09 16:15:39 【问题描述】:我正在尝试运行 C++ 线程,但也将实例传递给类本身。我似乎无法弄清楚。
我有一个线程参数结构:
struct CLASS_PARAMS
SomeClass* ptr;
;
然后我调用我的设置方法:
void SomeClass::setup()
CLASS_PARAMS params;
params.ptr = this;
CreateThread(NULL, 0, SetupThread, ¶ms, 0, NULL);
在SomeClass::setup()
上方,我定义SetupThread
:
DWORD WINAPI SetupThread(LPVOID lpParam)
CLASS_PARAMS* params = (CLASS_PARAMS *) lpParam;
SomeClass* inst = params->ptr;
....
....
但是,我在使用 inst
时遇到了读取访问冲突。我在SomeClass
中还有其他方法需要通过线程访问:
inst->getSomeValue();
...
inst->setSomeValue(someValue);
...
但它不允许我这样做。关于我做错了什么有什么建议吗?
【问题讨论】:
竞争条件:params
变量在线程开始执行时已不存在。
您不需要所有 C 级黑客。 std::thread
是为 C++ 设计的;改用它。
【参考方案1】:
你在堆栈上分配CLASS_PARAMS
,所以它在使用前被销毁。
动态分配它,传递指针并在线程中释放它。
或者,如果您只需要传递this
,则传递它而不使用包装结构,只需转换为LPVOID
并返回(但请务必使用相同的类指针类型以避免指针调整错误)
【讨论】:
谢谢先生。将this
转换为LPVOID
并返回完美。以上是关于如何将“this”指针传递给 C++ WinAPI 线程?的主要内容,如果未能解决你的问题,请参考以下文章