AW: TThreadPool.Default.QueueWorkItem - wie parameter mitgeben
Hier mal den Wrapper in einer eigenen Unit mit bis zu 4 Argumenten
Delphi-Quellcode:
Und nun ein kleines Beispiel
unit Generics.Utils;
interface uses System.SysUtils; type TWrapper = class class function Proc<T>( AProc: TProc<T>; Arg: T ): TProc; overload; class function Proc<T1, T2>( AProc: TProc<T1, T2>; Arg1: T1; Arg2: T2 ): TProc; overload; class function Proc<T1, T2, T3>( AProc: TProc<T1, T2, T3>; Arg1: T1; Arg2: T2; Arg3: T3 ): TProc; overload; class function Proc<T1, T2, T3, T4>( AProc: TProc<T1, T2, T3, T4>; Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4 ): TProc; overload; end; implementation {TWrapper} class function TWrapper.Proc<T1, T2, T3, T4>( AProc: TProc<T1, T2, T3, T4>; Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4 ): TProc; begin Result := procedure begin AProc( Arg1, Arg2, Arg3, Arg4 ); end; end; class function TWrapper.Proc<T1, T2, T3>( AProc: TProc<T1, T2, T3>; Arg1: T1; Arg2: T2; Arg3: T3 ): TProc; begin Result := procedure begin AProc( Arg1, Arg2, Arg3 ); end; end; class function TWrapper.Proc<T1, T2>( AProc: TProc<T1, T2>; Arg1: T1; Arg2: T2 ): TProc; begin Result := procedure begin AProc( Arg1, Arg2 ); end; end; class function TWrapper.Proc<T>( AProc: TProc<T>; Arg: T ): TProc; begin Result := procedure begin AProc( Arg ); end; end; end.
Delphi-Quellcode:
program dp_184827;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Generics.Utils in 'Generics.Utils.pas'; procedure DoFoo( AStr: string; AInt: Integer ); begin Writeln( 'CALL DoFoo( AStr: ', QuotedStr( AStr ), ', AInt: ', AInt ); end; procedure Test; var LProc: TProc; begin // Direkter Aufruf von DoFoo DoFoo( {AStr} 'Ein String', {AInt} 42 ); // Wrappen mit Argumenten LProc := TWrapper.Proc<string, Integer>( {AProc} DoFoo, {Arg1} 'Ein String', {Arg2} 42 ); // Aufrufen LProc( ); end; begin try Test; except on E: Exception do Writeln( E.ClassName, ': ', E.Message ); end; ReadLn; end. |
AW: TThreadPool.Default.QueueWorkItem - wie parameter mitgeben
Delphi-Quellcode:
Danke erstmal für deine ausführliche Antwort.:)
// Wrappen mit Argumenten
LProc := TWrapper.Proc<string, Integer>( {AProc} DoFoo, {Arg1} 'Ein String', {Arg2} 42 ); kann ich dabei auch variablen angeben, ansonsten wärs ja ziemlich sinnlos und auch ziemlich viel Code? Die ganzen Proceduredeklarationen für einen weiteren Parameter. Da ich gerne universelle "einmal machen und vergessen"- Lösungen habe würde ich es vermutlich doch so machen das ich ein TDictionary übergebe mit Keyvaluepairs vom Typ (String, Variant). Meine einzige Sorge dabei wäre eventuell die Typkompatibilität in alle Fällen gegeben ist. mfg Newbe |
AW: TThreadPool.Default.QueueWorkItem - wie parameter mitgeben
Zitat:
Zitat:
Eigentlich ist es ähnlich zu dem, was du mit deinem Dictionary da machen möchtest. Aber dir ist doch ein Tuple bekannt? So etwas geht mit Delphi auch ... wenn man sich das baut und dann übergibt man eben so ein Tuple - also ein Argument ;) |
AW: TThreadPool.Default.QueueWorkItem - wie parameter mitgeben
@Sir Rofu
Danke für deine umfassenden Ausführungen. Ich werde das mal mit den generics probieren, mal schauen wie ich damit klar komme. @himitsu das ist ja mal ein fieses Stück Sourcecode xD
Delphi-Quellcode:
S := 'Welt';
B := False; while not B do TThread.Synchronize(nil, procedure begin B := InputQuery('Hallo', 'Du', S); end; if S <> 'Welt' then FühreWeltuntergangHerbei; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz