Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Container? (https://www.delphipraxis.net/194082-omnithreadlibrary-ist-fuer-meine-anforderung-der-richtige-weg-welchen-container.html)

GPRSNerd 20. Okt 2017 14:20

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Hallo Codehunter,

ich habe interessiert mitgelesen, da ich ein ähnliches Problem mit dem Einlesen von Dateieigenschaften mit Parallelisierung lösen und beschleunigen möchte.
Ich habe deinen Code jetzt pro Forma mal in ein Testprogramm eingebaut und irgendwas stimmt mit der Parametrisierung des synchonize()-Aufrufs noch nicht:

[dcc32 Fehler] uMain.pas(247): E2250 Es gibt keine überladene Version von 'Synchronize', die man mit diesen Argumenten aufrufen kann

in der Codezeile:
Delphi-Quellcode:
    Synchronize(FOnComplete(Self, FFileName));


Hast du ne Idee? (dafür reicht mein Thread-Wissen nicht aus)

TiGü 20. Okt 2017 16:03

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von GPRSNerd (Beitrag 1383793)
[dcc32 Fehler] uMain.pas(247): E2250 Es gibt keine überladene Version von 'Synchronize', die man mit diesen Argumenten aufrufen kann

in der Codezeile:
Delphi-Quellcode:
    Synchronize(FOnComplete(Self, FFileName));
Hast du ne Idee? (dafür reicht mein Thread-Wissen nicht aus)


Wenn es in den Mainthread soll:
Delphi-Quellcode:
    Synchronize(nil, FOnComplete(Self, FFileName));


Wie machst du es sonst, wenn der Compiler nach dem Code eintippen meldet das in der Parameterliste ein Argument zuviel oder zuwenig ist?

GPRSNerd 20. Okt 2017 16:36

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von TiGü (Beitrag 1383795)
Wie machst du es sonst, wenn der Compiler nach dem Code eintippen meldet das in der Parameterliste ein Argument zuviel oder zuwenig ist?

Genau so vor meiner Anfrage gemacht und folgenden einzigen Parameter angezeigt bekommen:
Delphi-Quellcode:
AMethod

Nach dem Hinzufügen eines weiteren Parameters (zb nil) kommt immer noch die gleiche Fehlermeldung.
Es muss also eher an dem Parameter FOnComplete() liegen...

Delphi-Quellcode:
Synchronize(nil, FOnComplete(Self, FFileName));

TiGü 20. Okt 2017 16:46

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von GPRSNerd (Beitrag 1383797)
Zitat:

Zitat von TiGü (Beitrag 1383795)
Wie machst du es sonst, wenn der Compiler nach dem Code eintippen meldet das in der Parameterliste ein Argument zuviel oder zuwenig ist?

Genau so vor meiner Anfrage gemacht und folgenden einzigen Parameter angezeigt bekommen:
Delphi-Quellcode:
AMethod

Nach dem Hinzufügen eines weiteren Parameters (zb nil) kommt immer noch die gleiche Fehlermeldung.
Es muss also eher an dem Parameter FOnComplete() liegen...

Delphi-Quellcode:
Synchronize(nil, FOnComplete(Self, FFileName));

Abgesehen davon das der Cursor hinter der öffnen Klammer und Ctrl+Shift+Space vier Überladungen für Synchronize zeigt hast du natürlich recht.

Du musst den Code so anpassen:
Delphi-Quellcode:
procedure TMp3ReaderThread.DoComplete;
begin
  if Assigned(FOnComplete) then
  begin
    Synchronize(nil,
      procedure
      begin
        FOnComplete(Self, FFileName)
      end);
  end;
end;
Erklärung:
Es wird einer dieser Typen erwartet:
Delphi-Quellcode:
  TThreadMethod = procedure of object;
  TThreadProcedure = reference to procedure;
FOnComplete ist aber vom Typ
Delphi-Quellcode:
TMp3ReaderComplete = procedure (Thread: TMp3ReaderThread; FileName: string) of object;
, darum muss man da noch was drumstricken.

GPRSNerd 20. Okt 2017 17:37

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von TiGü (Beitrag 1383798)
Du musst den Code so anpassen:
Delphi-Quellcode:
procedure TMp3ReaderThread.DoComplete;
begin
  if Assigned(FOnComplete) then
  begin
    Synchronize(
      procedure
      begin
        FOnComplete(Self, FFileName)
      end);
  end;
end;

Compiled das bei dir? Ich sehe immer noch die gleiche Fehlermeldung.

TiGü 20. Okt 2017 18:05

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von GPRSNerd (Beitrag 1383801)
Zitat:

Zitat von TiGü (Beitrag 1383798)
Du musst den Code so anpassen:
Delphi-Quellcode:
procedure TMp3ReaderThread.DoComplete;
begin
  if Assigned(FOnComplete) then
  begin
    Synchronize(nil,
      procedure
      begin
        FOnComplete(Self, FFileName)
      end);
  end;
end;

Compiled das bei dir? Ich sehe immer noch die gleiche Fehlermeldung.

Ja.
Schreib mal TThread.Synchronize(nil,...

freimatz 20. Okt 2017 18:55

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von HolgerX (Beitrag 1383693)
Ist doch auch im Beispiel von Codehunter vorhanden:

je File ein Tmp3Data, gespeichert in DL: Tmp3DataList; als Liste... ;)

Ja das ist in dem Beispiel vorhanden. Ich sah das nur als ein Beispiel an um die Parallelierierung zu zeigen. Die konkreten Typen halte ich für diskussionswürdig und ich meinte darum ging es dem Threadersteller.

Nun konkret: Vorgeschlagen wurde in Record "Tmp3Data "für einen Eintrag. Das finde ich schon mal nicht schlecht.
Dann aber schreibst du "als Liste". Im Vorschlag steht aber "Tmp3DataList = TDictionary<string, Tmp3Data>;". Das ist keine Liste. :wink: TDictionary verwende ich selber häufig, juergen könnte dann Probleme haben alle Einträge da rauszuholen. Es kommt drauf an wie da zugriffen werden soll.
Später gibt es dann noch doch eine Liste "Tmp3ThreadList = TList<Tmp3ReaderThread>".
Ich möchte hier nicht dem Codehunter an den "Karren fahren", es sollte ja ein Denkanstoss sein und scheint auch geholfen zu haben. :)

GPRSNerd 20. Okt 2017 22:55

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Zitat:

Zitat von TiGü (Beitrag 1383805)
Ja.
Schreib mal TThread.Synchronize(nil,...

Nö, immer noch gleiche Fehlermeldung.

HolgerX 21. Okt 2017 01:13

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Hmm..

Stell mal (bezogen auf das Beispiel) so um:

Delphi-Quellcode:
procedure Tmp3ReaderThread.Execute;
begin
  Lese_die_Datei_aus(FFileName, FData); // Speicher von FData liegt im Thread!
 
  Synchronize(DoComplete);
end;

procedure Tmp3ReaderThread.DoComplete;
begin
  if Assigned(FOnComplete) then
    FOnComplete(Self, FFileName);
end;

GPRSNerd 21. Okt 2017 13:16

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
 
Jau, so compiled es jetzt!
Danke HolgerX.

Edit: Kleinere Korrekturen wären noch:
1. Der Konstruktor für die ThreadListe ist parameterlos: TL := Tmp3ThreadList.Create;
2. Das Auswählen des Records der DateiListe geht nicht mit Pointer, sondern (vermutlich) mit der Dereferenzierung: if DL.TryGetValue(Filename, Data^) then


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz