gpt4 book ai didi

windows - 如何使用 postThreadMessage 传递结构

转载 作者:可可西里 更新时间:2023-11-01 14:37:10 24 4
gpt4 key购买 nike

我想使用 Windows 的消息队列功能将结构发送到另一个线程。但是我发现postthreadmessage函数只提供了两个整型参数,lparam和wparam供我传递参数。所以我决定把struct的地址放在lparam中。这是 Windows 用来传递结构的正确方法吗?

我打算使用 boost::shared_ptr 在接收线程和发送线程中保存结构的地址。我怀疑当两个 shared_ptr 超出范围时,结构会被释放两次吗?我想不出一种方法来确保分配在堆上的结构将 100% 释放,有什么想法吗?

最佳答案

对于第一个问题,是的,LPARAM 旨在用作整数或指针。从定义中可以清楚地看出这一点:

typedef LONG_PTR LPARAM;

这是一个足以容纳指针的整数。

关于 shared_ptr 的事情,你是对的,如果你传递原始指针并将它包装到另一个 shared_ptr 中,你将释放它两次:

shared_ptr<Thing> a;
PostThreadMessage(x, 0, (LPARAM)a.get());
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> p((Thing*)lp); //Bad!!!
}

但您可以改为尝试此解决方法:

shared_ptr<Thing> a;
PostThreadMessage(x, 0, new shared_ptr<Thing>(a)); //pointer to smart-pointer
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> *pp = (shared_ptr<Thing>*)lp;
shared_ptr<Thing> p(*pp);
delete pp; //no leak
}

AFTERTHOUGHT:注意 PostThreadMessage 可能会失败...并且您不希望泄漏 shared_ptr。

根据我的经验,通常最好使用 std::deque 来保存数据并使用 PostThreadMessage 来通知那里有数据。这样你就永远不会丢失任何对象! YMMV

关于windows - 如何使用 postThreadMessage 传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130633/

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