Multithreading delphi xe2正确处理从将指针发送到主线程的线程创建的指针

Multithreading delphi xe2正确处理从将指针发送到主线程的线程创建的指针,multithreading,delphi,pointers,delphi-xe2,tthread,Multithreading,Delphi,Pointers,Delphi Xe2,Tthread,我想问几个问题,让我先向你解释一下,你可以在这篇文章下面看到这些问题。我创建了一个多线程应用程序,可以从数据库读取和更新数据。线程使用sendmessage与主线程通信。我正在将指针TRecord传递给sendmessage,并在主线程中处理指针。下面是显示流程结构的代码片段: const WM_MY_MESSAGE = WM_USER + 0; PTestPointerRecord : ^TTestPointerRecord; TTestPointerRecord = record i

我想问几个问题,让我先向你解释一下,你可以在这篇文章下面看到这些问题。我创建了一个多线程应用程序,可以从数据库读取和更新数据。线程使用sendmessage与主线程通信。我正在将指针TRecord传递给sendmessage,并在主线程中处理指针。下面是显示流程结构的代码片段:

const WM_MY_MESSAGE = WM_USER + 0;

PTestPointerRecord : ^TTestPointerRecord;
TTestPointerRecord = record
  i : integer;
end;
下面是扩展TThread类的执行事件。除非线程暂停或终止,否则它将持续运行

procedure TSampleThreadClass.Execute;
var
  TestPointerRecord : PTestPointerRecord;
  FConnection : TConnectionObject;
  FQuery : TQueryObject;
begin
  while not Terminated do
  begin
    New(PTestPointerRecord);
    FConnection := TConnectionObject.Create(nil);
    FQuery := TQueryObject.Create(nil);
    try
      FConnection.connectionstring := 'path';
      FConnection.loginPrompt := False;
      FConnection.open;

      FQuery.connection := FConnection;
      FQuery.close;
      FQuery.sql.clear;
      FQuery.sql.add('select column1, column2 from table');
      FQuery.open;

      PTestPointerRecord.i := 0;
      SendMessage(frmMain.handle, WM_MY_MESSAGE, 0, integer(PTestPointerRecord));
    finally
      FQuery.close;
      FConnection.disconnect;

      FreeAndNil(FQuery);
      FreeAndNil(FConnection);

      sleep(250);
    end;
  end;  
end;
下面是从线程接收消息的事件

procedure TfrmMain.message(msg : TMessage);
var
  TestPointerRecord : PTestPointerRecord;
begin
  TestPointerRecord := PTestPointerRecord(msg.lParam);
  try
    edit1.Text := inttostr(TestPointerRecord.i);  
  finally
    Dispose(TestPointerRecord);
  end;
end;
该应用程序将被用作服务类型的应用程序,将一直持续运行

问题:
1.我是否正确处理指针?
2.当我在应用程序运行时检查任务管理器时,我发现在“进程”选项卡下,内存(专用工作集)不断增加。这样好吗


关于所有

我尝试了David Heffernan关于使用单独句柄而不是使用主窗体句柄的建议。这个建议并没有真正解决问题,但多亏了David,它是值得使用的,因为他非常重视在使用主窗体的句柄接收消息并重新绘制或重新创建窗口时可能出现的问题

通过对我的代码进行更深入的探索,通过调试,反复试验。当我创建连接并查询数据库时,我发现问题再次出现。注意,我正在使用ZeosLib连接到数据库,似乎每次我的线程循环、执行数据库操作时,工作的私有内存都在不断增加,我不确定ZeosLib是否是线程安全的。所以我改用ADO,一切都很顺利。工作专用内存保持在一个稳定的数量


谢谢您的帮助。

请拨打Dispose。最大的问题是窗口句柄可能会被重新创建。如果在线程中发生这种重新创建,则会发生灾难。您需要使用通过调用AllocateHWnd创建的专用窗口句柄。当然,由于您发送了消息,线程将阻塞,直到消息被处理为止。因此,不需要在主线程中进行处理。您可以在线程中进行处理。实际上,您甚至不需要动态分配。局部变量可以。@DavidHeffernan您好,谢谢您的回复。我在相关的帖子上看到了这个答案。我看到你在这个帖子里和某人争论。我想知道,雷米在这里发布的另一个答案,我想这和你现在想告诉我的一样,你认为可以使用吗?它真的不会导致内存泄漏吗?感谢代码使用了异步的PostMessage。至于你在评论中提出的问题,请阅读我前面的评论。@DavidHeffernan是的,这是PostMessage。我想告诉你的是窗口句柄的创建。我想知道我是否可以使用雷米在帖子中创建窗口句柄的相同方法?