gpt4 book ai didi

multithreading - TThread执行的结果

转载 作者:行者123 更新时间:2023-12-03 18:27:21 25 4
gpt4 key购买 nike

即使表单没有冻结,此代码似乎也不是获取线程结果的正确方法,并且我可以执行其他任务,也许执行其他请求,因此线程数不会一直等于一个,最多可能同时有5个请求,但彼此之间并不依赖。

应该如何以“良好”方式完成此任务?

function TEApi.FApiRequest(Request: string) : string;
var
RequestThread : TApiSecureRequest; {TThread}
begin
RequestThread := TApiSecureRequest.Create(Self, Request);
while(NOT RequestThread.Terminated) do
Application.ProcessMessages;
Result := RequestThread.FResponse;
RequestThread.Free;
end;

procedure TApiSecureRequest.Execute;
begin
{do some HTTP requests, which is freezing the Mainform without threading}
FResponse = Result_of_execution;
Terminate;
end;

最佳答案

不要使用Application.ProcessMessages。这是不良代码设计的示例,应避免使用它。

而是使用线程回调或消息。例子:

uAPISecureRequestThread.pas

unit uAPISecureRequestThread;

interface

uses
System.Classes;

type
TApiSecureRequestThread = class(TThread)
private
FResponse: String;
protected
procedure Execute; override;
public
constructor Create;

property Response: String read FResponse;
end;

implementation

constructor TApiSecureRequestThread.Create;
begin
inherited Create(TRUE);
FreeOnTerminate := TRUE; // automatically free thread on terminate
end;

procedure TApiSecureRequestThread.Execute;
begin
// do the work here and assign result to FResponse
end;

end.

uMainForm.pas
unit uMainForm;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TfrmMain = class(TForm)
btCreateThread: TButton;
procedure btCreateThreadClick(Sender: TObject);
private
procedure ASRThreadTerminate(Sender: TObject);
public
end;

var
frmMain: TfrmMain;

implementation

{$R *.dfm}

uses
uApiSecureRequestThread;

procedure TfrmMain.btCreateThreadClick(Sender: TObject);
var
asr_thread: TApiSecureRequestThread;
begin
asr_thread := TApiSecureRequestThread.Create;
try
asr_thread.OnTerminate := ASRThreadTerminate;
asr_thread.Start;
except
asr_thread.Free;
end;
end;

procedure TfrmMain.ASRThreadTerminate(Sender: TObject);
var
asr_thread: TApiSecureRequestThread;
begin
asr_thread := Sender as TApiSecureRequestThread;

// process asr_thread.Response here
end;

end.

关于multithreading - TThread执行的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18684667/

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