微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多线程 – 线程如何通知没有窗口句柄的对象?

我是多线程的新手,但不是一个完整的新手.我需要在工作线程中执行对Web服务的调用.

在主线程中,我有一个表单(TForm),它有一个私有数据成员(私有字符串),只有工作线程才能写入(我在它恢复之前将指针传递给线程).当工作线程完成其webservice调用并将结果响应xml写入表单上的私有成员时,工作线程使用PostMessage将消息发送到表单的句柄(我在恢复之前也将其传递给线程).

interface

const WM_WEBSERVCALL_COMPLETE = WM_USER + 1;

type 
  TWebServiceResponseXML = string;
  PWebServiceResponseXML = ^TWebServiceResponseXML;

  TMyForm = class(TForm)
    ...
  private
    ...
    fWorkerThreadID: Cardinal;
    fWebServiceResponseXML: TWebServiceResponseXML;
  public
    ...
    procedure StartWorkerThread;
    procedure OnWebServiceCallComplete(var Message: TMessage); Message WM_WEBSERVCALL_COMPLETE;
  end;

  TMyThread = class(TThread)
  private      
  protected
    procedure Execute; override;
  public
    SenderHandle: HWnd;
    RequestXML: string;
    ResponseXML: string;
    IMyService: IService;
    PResponseXML: PWebServiceResponseXML;
  end;

implementation

procedure TMyForm.StartWorkerThread;
var
  MyWorkerThread: TMyThread;
begin
  MyWorkerThread := TMyThread.Create(True);
  MyWorkerThread.FreeOnTerminate := True;
  MyWorkerThread.SenderHandle := self.Handle;
  MyWorkerThread.RequestXML := ComposeRequestXML;
  MyWorkerThread.PResponseXML := ^fWebServiceResponseXML;
  MyWorkerThread.Resume;
end;

procedure TMyForm.OnWebServiceCallComplete(var Message: TMessage);
begin
  // Do what you want with the response xml string in fWebServiceResponseXML
end;

procedure TMyThread.Execute;
begin
  inherited;
  CoInitialize(nil);
  try
    IMyService := IService.GetMyService(URI);
    ResponseXML := IMyService.Search(RequestXML);
    PResponseXML := ResponseXML;
    PostMessage(SenderHandle,WM_WEBSERVCALL_COMPLETE,0);
  finally
    CoUninitialize;
  end;
end;

它工作得很好,但现在我想从数据模块(没有Handle)做同样的事情……所以我真的很感激一些有用的代码来补充我的工作模型.

编辑

我真正想要的是能够让我替换线路的代码(如果可能的话)

MyWorkerThread.SenderHandle := self.Handle;

MyWorkerThread.SenderHandle := GetHandleForThisSOAPDataModule;

解决方法

我之前使用过这种技术取得了一些成功: Sending messages to non-windowed applications

基本上,在通过AllocateHWND获得的句柄上使用第二个线程作为消息泵.这无疑是令人恼火的,你最好使用库来处理所有细节.我更喜欢OmniThreadLibrary,但还有其他 – 见How Do I Choose Between the Various Ways to do Threading in Delphi?Delphi – Threading frameworks.

原文地址:https://www.jb51.cc/java/127720.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐