![]() |
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) |
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
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? |
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
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));
|
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
Du musst den Code so anpassen:
Delphi-Quellcode:
Erklärung:
procedure TMp3ReaderThread.DoComplete;
begin if Assigned(FOnComplete) then begin Synchronize(nil, procedure begin FOnComplete(Self, FFileName) end); end; end; Es wird einer dieser Typen erwartet:
Delphi-Quellcode:
FOnComplete ist aber vom Typ
TThreadMethod = procedure of object;
TThreadProcedure = reference to procedure;
Delphi-Quellcode:
, darum muss man da noch was drumstricken.
TMp3ReaderComplete = procedure (Thread: TMp3ReaderThread; FileName: string) of object;
|
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
|
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
Schreib mal TThread.Synchronize(nil,... |
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
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. :) |
AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai
Zitat:
|
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; |
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. |
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