tsm*_*smr 3 memory delphi multithreading vcl
我正在使用自定义Windows消息将工作线程中的信息交换到主VCL线程中的表单.每当我需要通过消息发送一些数据时,我这样做:
type
PntStr = ^string;
Run Code Online (Sandbox Code Playgroud)
然后PostMessage()
var
pointString : PntStr;
(...)
New(pointString);
pointString^ := mystring;
PostMessage(frmDest.Handle, UM_THREADMSG, UM_MYEVENT1, LPARAM(pointString));
Run Code Online (Sandbox Code Playgroud)
在接收表格上
try
myStrP := PntStr(MSG.LParam);
myfunction(myStrP^);
finally
Dispose(myStrP);
end;
Run Code Online (Sandbox Code Playgroud)
这是处理指针分配的内存的正确方法吗?在指针上调用Dispose()是否可以释放内存?
是的,您的方法在内存管理方面是正确的.New
并Dispose
正确处理托管类型.这就是他们存在的事情.
一些细微差别:
PostMessage
.如果失败,则消息未发布,线程需要处理内存.AllocateHWnd
用来创建一个你控制生活的窗口句柄.try/finally
错了.该try
资源已被收购后应该会出现.这是我们在这里看到的最常见的错误之一.在您的代码中,它可能是良性的,因为赋值不能引发异常,但仍然值得准确.