gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:56:22 25 4
gpt4 key购买 nike

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

在主线程中,我有一个带有私有(private)数据成员(私有(private)字符串)的表单(TForm),只有工作线程才会写入该表单(我在线程恢复之前将指向它的指针传递到线程中)。当工作线程完成其 Web 服务调用并将生成的响应 xml 写入表单上的私有(private)成员时,工作线程使用 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, 0);
finally
CoUninitialize;
end;
end;

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

编辑

我真正想要的是允许我替换该行的代码(如果可能)

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 .

关于multithreading - 线程如何通知没有窗口句柄的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com