multithreading - 消息后 LParam 截断

标签 multithreading delphi delphi-7 postmessage

我的应用程序有一个工作线程,我使用 PostMessage 将字符串发送到主线程。对于 1 条消息,当字符串到达​​主线程中的消息处理程序时,该字符串将被截断。

该字符串是在工作线程中根据如下所示的原始数据字符串构造的。它在最后一个“20”结束。

'01010000000030000102000008850008855343414E20454447452000000000000000000'

解码成我想要发送的字符串,如下所示,这是正确的:

'0100 0.50000 LSB0288.588.5扫描边缘'

创建“SCAN EDGE”部分并发布它的代码是: tmp 和 s_out 是字符串

x := 35;
for i := 1 to 10 do
begin
  tmp := '$' + copy(s,x,2);
  TryStrToInt(tmp,dec);
  s_out := s_out + chr(dec);
  x := x + 2;
end;
PostMessage(MainHandle,UM_CLONE, UM_756, Integer(PChar(s_out)));

主线程中的消息处理程序是: 我是一个字符串

i := pChar(msg.LParam);

当它到达主线程时,我在调试器中看起来像这样:

'0100 0.50000 LSB0288.588.5SCAN EDG'#0

我该如何纠正这个问题?

最佳答案

您正在发布 String 变量的内容,该变量是调用 PostMessage() 的线程过程的本地变量。如果String超出范围并在主线程处理发布的消息之前被释放,那么内存将是垃圾。

您需要:

1) 使用 SendMessage() 而不是 PostMessage(),以便 String 保留在作用域内,直到消息处理程序退出:

SendMessage(MainHandle, UM_CLONE, UM_756, LPARAM(PChar(s_out)));

2) 在内存中动态分配一个String,根据需要填充它,发布它,然后让主消息处理程序在复制完成后释放它:

var
  s_out: PString;

New(s_out);
...
s_out^ := s_out^ + chr(dec);
...
if not PostMessage(MainHandle, UM_CLONE, UM_756, LPARAM(s_out)) then
  Dispose(s_out);

.

var
  ps: PString;
  i: String;

ps := PString(msg.LParam);
i := ps^;
Dispose(ps);

PS:请注意,我还将您的 Integer() 转换为 LPARAM()。如果您升级到 Delphi XE2 或更高版本,这一点非常重要。 PostMessage()SendMessage() 使用 LPARAM,而不是 Integer。您可以在 Delphi 7 中摆脱它,因为在该版本中 LPARAM 是 Integer 的别名,但在现代 Delphi 版本中不再是这种情况。 LPARAM 现在是 NativeUInt 的别名。 LPARAM 一直是 Win32 API 中的未签名类型,Delphi 在早期版本中只是犯了错误,但 Embarcadero 自从添加了对 64 位的支持以来,一直在努力插入 RTL/VCL 中的类型正确性。位和跨平台开发。如果您没有正确匹配正确的数据类型,则可能会在运行时导致范围检查错误等。

关于multithreading - 消息后 LParam 截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932164/

相关文章:

c++ - 通过连接 QObject 使用 std::future

c++ - 重置线程事件 - C++

java - 如何在 ImageJ 中使用线程打开文件夹? ( java )

c# - C# 中没有 'property type' 的属性

delphi - 无法在 Delphi XE2 应用程序中显示 .chm 帮助文件 - 为什么?

delphi - 我应该如何在本地存储多用户应用程序的密码?

delphi - 扩展 ASCII 字符显示为 ? (问号)

delphi - stringgrid 列名插入日期和日期信息

c++ - 如何在 C++11 的 Mac OS X 上命名 std::thread?

delphi - 使base64解码的文本可见而不改变 "windows language for non unicode program settings"“