Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.435 Beiträge
 
Delphi 7 Professional
 
#8

AW: Unit zu unbekanntem Variablentype gesucht (generell)

  Alt 1. Apr 2024, 08:59
Die KI meiner Wahl hat dazu folgendes zu vermelden:
Zitat von Frage:
Können Sie mir für Delphi die Unit benennen, in der die Klasse TSync definiert ist?
Zitat von Antwort:
Entschuldigung, aber ich konnte keine spezifische Delphi-Unit finden, in der die Klasse TSync definiert ist. Es könnte sein, dass diese Klasse in einer benutzerdefinierten Unit definiert ist oder in einer weniger bekannten oder veralteten Delphi-Unit. Es wäre hilfreich, wenn Sie weitere Details oder den Kontext bereitstellen könnten, in dem Sie diese Klasse verwenden. Bitte überprüfen Sie auch die Dokumentation oder den Quellcode, wenn Sie Zugriff darauf haben.

Quelle: Unterhaltung mit Bing, 1.4.2024
(1) delphi - How do you create a class in one unit, and use it as a return .... https://stackoverflow.com/questions/...-in-another-un.
(2) Programme und Units (Delphi) – RAD Studio. https://docwiki.embarcadero.com/RADS...amme_und_Units.
(3) Klassen und Objekte (Delphi) – RAD Studio. https://docwiki.embarcadero.com/RADS...e_%28Delphi%29.
Zitat von Frage:
Mir ist in dem Zusammenhang nur der nachfolgende Quelltext bekannt:
Delphi-Quellcode:
type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;

var
  MyJSON: TMyJSON;
  MyJSONArray: TArray<TMyJSON>;
  Dummy_Count: Integer;
  Tasks: TList<TTask>;
  Sync: TSync;

procedure SearchGoogleSingleISBNTask(const Dummy_String: string);
var
  MyJSON: TMyJSON;
begin
  MyJSON := SearchGoogleSingleISBN(Dummy_String);
  // ...weitere Verarbeitung von MyJSON...
end;

begin
  Dummy_Count := ListBox1.Count - 1;
  SetLength(MyJSONArray, Dummy_Count);
  Sync := TSync.Create;

  uses System.SyncObjects; // Add this line

  for Dummy_Int := Dummy_Count downto 0 do
  begin
    while Tasks.Count >= 5 do
      Sync.WaitFor;

    TTask.Create(
      procedure
      begin
        SearchGoogleSingleISBNTask(ListBox1.Items[Dummy_Int]);
        Sync.Signal;
      end
    ).Start;
    Tasks.Add(TTask.Last);
  end;

  // Warten auf Abschluss aller Tasks
  while Tasks.Count > 0 do
    Sync.WaitFor;

  // ...Datenbankaktualisierung...
  for Dummy_Int := 0 to Dummy_Count do
  begin
    MyJSON := MyJSONArray[Dummy_Int];
    if MyJSON.TotalItems = 1 then
      // ...hier Code zur Datenbankaktualisierung...
  end;
end;
Zitat von Fortsetzung der Frage:
Können Sie damit etwas anfangen oder ist das bei der Suche hilfreich?
Zitat von Antwort:
Ja, das ist sehr hilfreich. In Ihrem Code verwenden Sie die Klasse 'TSync' aus der Unit 'System.SyncObjects'. Diese Klasse ist Teil der Delphi-Standardbibliothek und wird für die Synchronisation von Threads in einer Multithread-Anwendung verwendet².

In Ihrem speziellen Fall wird 'TSync' verwendet, um die Ausführung von parallelen Tasks zu koordinieren. Die Methode 'WaitFor' blockiert die Ausführung des Hauptthreads, bis ein Signal von einem der parallelen Tasks empfangen wird, das durch die Methode 'Signal' gesendet wird. Dies stellt sicher, dass der Hauptthread auf den Abschluss aller parallelen Tasks wartet, bevor er fortfährt.

Bitte beachten Sie, dass Sie die Unit 'System.SyncObjects' in den Uses-Klauseln am Anfang Ihrer Unit hinzufügen müssen, nicht innerhalb der Prozedur oder Funktion. Hier ist der korrigierte Code:
Delphi-Quellcode:
uses
  System.SyncObjects; // Move this line to the top

type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;

var
  MyJSON: TMyJSON;
  MyJSONArray: TArray<TMyJSON>;
  Dummy_Count: Integer;
  Tasks: TList<TTask>;
  Sync: TSync;

procedure SearchGoogleSingleISBNTask(const Dummy_String: string);
var
  MyJSON: TMyJSON;
begin
  MyJSON := SearchGoogleSingleISBN(Dummy_String);
  // ...weitere Verarbeitung von MyJSON...
end;

begin
  Dummy_Count := ListBox1.Count - 1;
  SetLength(MyJSONArray, Dummy_Count);
  Sync := TSync.Create;

  for Dummy_Int := Dummy_Count downto 0 do
  begin
    while Tasks.Count >= 5 do
      Sync.WaitFor;

    TTask.Create(
      procedure
      begin
        SearchGoogleSingleISBNTask(ListBox1.Items[Dummy_Int]);
        Sync.Signal;
      end
    ).Start;
    Tasks.Add(TTask.Last);
  end;

  // Warten auf Abschluss aller Tasks
  while Tasks.Count > 0 do
    Sync.WaitFor;

  // ...Datenbankaktualisierung...
  for Dummy_Int := 0 to Dummy_Count do
  begin
    MyJSON := MyJSONArray[Dummy_Int];
    if MyJSON.TotalItems = 1 then
      // ...hier Code zur Datenbankaktualisierung...
  end;
end;
Zitat von Fortsetzung der Antwort:
Ich hoffe, das hilft! Wenn Sie weitere Fragen haben, lassen Sie es mich bitte wissen.

Quelle: Unterhaltung mit Bing, 1.4.2024
(1) System.SyncObjs.TSynchroObject - RAD Studio API Documentation. https://docwiki.embarcadero.com/Libr...TSynchroObject.
(2) Why TSync(Time Synchronization) is needed in Adaptive AUTOSAR?. https://stackoverflow.com/questions/...aptive-autosar.
(3) Specification of Time Synchronization - AUTOSAR. https://www.autosar.org/fileadmin/st...ronization.pdf.
Der Fehler liegt in der Zeile des Quelltextes, die mich sofort stutzig gemacht hat: Das Uses mitten im Quelltext.

Geändert von Delphi.Narium ( 1. Apr 2024 um 11:48 Uhr)
  Mit Zitat antworten Zitat