Bei Delphi 10.4 gibt es scheinbar keine Möglichkeit, mittels TThreadPool die Anzahl der Threads zu begrenzen, daher der Versuch über TSemaphore.
Habe ich auch nicht verstanden.
Genau das tust du doch schon in deinem
Dummy_ThreadPool.SetMaxWorkerThreads(Dummy_MaxTasks);
Ist das nicht genau, was du willst?
Zitat von
Der schöne Günther:
PS: Das eigentliche Abholen der Daten lässt sich sehr stark vereinfachen:
Ist das ein Thread?
Nein, das sollte nur zeigen, wie stark sich das eigentliche Abholen vom Server vereinfachen lässt, damit man sich nicht mehr mit Http-Returncodes und sonstwas herumschlagen muss. Anfrage raus, Json zurück, fertig.
Aber natürlich kann man das auch parallelisieren.
Hierzu würde ich aber einmal das Thema hier überfliegen, insbesondere die Beiträge des immer äußerst lesenswerten Herrn Raabe:
https://en.delphipraxis.net/topic/54...s-in-parallel/
Ich habe das einmal so runtergetippt wie ich das machen würde, hier fehlt natürlich noch deine Konvertierung des Json-Strings von der Google-
API in deinen eigenen Typ
TJSon_Items
.
Delphi-Quellcode:
unit Unit1;
interface uses
System.SysUtils,
System.Classes,
System.Threading,
Data.Bind.Components,
Data.Bind.ObjectScope,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
REST.Types,
REST.Client;
type
TForm1 =
class(TForm)
button_serial: TButton;
button_parallel: TButton;
procedure button_serialClick(Sender: TObject);
function getIsbnJson(
const isbn:
String):
String;
function getIsbnJsonAsync(
const isbn:
String): IFuture<
String>;
procedure button_parallelClick(Sender: TObject);
end;
var
Form1: TForm1;
const
ISBNs: TArray<
String> = [
'
978-3-77073-431-3',
'
978-0-59600-224-4',
'
3-630-61957-6',
'
978-3-89086-120-3',
'
978-3-89086-138-8'
];
implementation uses System.Diagnostics;
{$R *.dfm}
procedure TForm1.button_serialClick(Sender: TObject);
begin
const stopwatch = TStopwatch.StartNew();
for var isbn
in ISBNs
do
getIsbnJson(isbn);
stopwatch.Stop();
ShowMessageFmt('
Ms taken: %d ms', [stopwatch.ElapsedMilliseconds]);
end;
procedure TForm1.button_parallelClick(Sender: TObject);
begin
var tasks: TArray<IFuture<
String>> := [];
const stopwatch = TStopwatch.StartNew();
for var isbn
in ISBNs
do
tasks := tasks + [getIsbnJsonAsync(isbn).Start()];
for var task
in tasks
do
task.Wait();
stopwatch.Stop();
ShowMessageFmt('
Ms taken: %d ms', [stopwatch.ElapsedMilliseconds]);
end;
function TForm1.getIsbnJson(
const isbn:
String):
String;
begin
const request = TRESTRequest.Create(
nil);
try
request.Resource := '
books/v1/volumes?q=isbn:{ISBN}';
request.Params.AddItem('
isbn', isbn, TRESTRequestParameterKind.pkURLSEGMENT);
const client = TRESTClient.Create(
{Owner:}request);
client.BaseURL := '
https://www.googleapis.com';
client.SynchronizedEvents := False;
request.Client := client;
request.SynchronizedEvents := False;
request.Execute();
Result := request.Response.JSONText;
finally
request.Destroy();
end;
end;
function TForm1.getIsbnJsonAsync(
const isbn:
String): IFuture<
String>;
begin
Result := TTask.Future<
String>(
function():
String
begin
Result := getIsbnJson(isbn);
end
);
end;
end.