【发布时间】:2016-04-11 22:18:54
【问题描述】:
我编写了一个使用 MFC 的程序,因此使用了诸如 PostMessage 之类的 WinAPI 函数。它主要只是一个窗口线程和一个网络客户端线程。
我创建了自己的消息,到目前为止它运行良好。
稍微解释一下程序:
我编写了一个客户端,它通过网络获取消息,对其进行解码,然后需要将消息发送到显示消息值的窗口。所有这些都有效 - 使用 32 位值。这肯定是某种不正确地使用 PostMessage 函数,因为 lParam 和 wParam 通常是指针。但是我不能只使用指针,因为我的客户端应用程序和我的窗口应用程序是两个不同的线程,并且客户端应用程序中的值会尽快被删除。 (客户端需要从服务端调用循环请求)
#define DEVICE_INFO_DATETIME 70000
long long date;
date = (value->serverTimestamp);
PostMessage(getWindowHandle(), WM_NEW_DATA, date, DEVICE_INFO_DATETIME);
问题是我得到了时间戳和其他编码为 64 位的数据。 wparam 和 lparam 只是 32 位,所以它总是截断我的值。好的,我可以用 64 位编译它,然后使用 64 位值,但这与 32 位系统不兼容(对吗?),而不是我想要的。这种代码的一种解决方法是设置一个临时的 64 位值或一个 64 位值的数组作为全局变量,但我不想将它们全部保存在与内存有关的单独值中。仅传递值将是这里的最佳解决方案。
你猜到我能在这里做什么吗?
【问题讨论】:
-
您只需要传递指针的所有权。工作线程分配,UI线程可以清理。不要忘记检查 PostMessage 的返回值。
-
如何传递所有权?你的意思是我可以在我的工作线程中分配一个 64 位变量(例如使用 malloc),通过 PostMessage 将指针传递给我的 UI,然后在使用值 free() 之后指针?我知道 C++ 中有类似 SmartPointers 之类的东西,但我正在为我的工作人员使用裸 C 环境。