Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Synchronize mit Argumenten (https://www.delphipraxis.net/158203-synchronize-mit-argumenten.html)

Viktorii 9. Feb 2011 13:22

Delphi-Version: 5

Synchronize mit Argumenten
 
Moin.

Erstmal habe ich schon gelesen, dass das was ich im Titel geschrieben habe nicht zu gehen scheint.

Mal ein Beispiel für mein Problem: Ich habe in einem Thread in dem z.B. irgendwelche Fehler auftreten können. Jetzt möchte ich meinem Hauptthread je nach aufgetretenem Fehler verschiedene Strings über geben.

Soweit bin ich schon:

Delphi-Quellcode:
type
  TInstError = procedure(const Content: String) of object;
 
  TMyOwnThread = class(TThread)
  private
    FInstError: TInstError;
    procedure SyncError;
  public
    property InstError: TInstError read FInstError write FInstError;
  end;
 
implementation
 
procedure TMyOwnThread.SyncError;
begin
  if Assigned(FInstError)
    then FInstError('ErrorString');
end;
 
procedure TMyOwnThread.Execute;
begin
  ...
  // Error 1
  Synchronize(SyncError);
  ...
  // Error 2
  Synchronize(SyncError);
  ...
  // Error 3
  Synchronize(SyncError);
 
  usw.
end;


procedure Form1.InstError(const Content: String);
begin
  RichEditError.Lines.Add(Content);
end;

So müsste ich aber für jeden Fehler einen eigene Methode erstellen welche ich mit Synchronize aufrufe.

Ich finde es schon lästig, dass ich überhaupt eine zusätzlich Methode dafür brauche. Das fördert nicht gerade die Übersichtlichkeit.

Aber wenn ich für jeden String ne eigene Methode brauch werd' ich ja bekloppt :pale:

Wie kann ich das eleganter lösen?

Vielen Dank

DeddyH 9. Feb 2011 13:27

AW: Synchronize mit Argumenten
 
Spendier doch dem Thread ein privates Stringfeld, in das Du die Fehlermeldung schreibst. Dieses übergibst Du dann mittels FInstError.

[edit] *Hehe* schneller :) [/edit]

Bummi 9. Feb 2011 13:27

AW: Synchronize mit Argumenten
 
Delphi-Quellcode:
procedure TMyOwnThread.SyncError;
begin
  if Assigned(FInstError)
    then FInstError(FError);
end;
 
procedure TMyOwnThread.Execute;
begin
  ...
  // Error 1
  FError := 'Error 1' ;
  Synchronize;
  ...
  // Error 2
  FError := 'Error 2' ;
  Synchronize;
 
  usw.
end;

Sir Rufo 9. Feb 2011 13:37

AW: Synchronize mit Argumenten
 
Tja, das ist mit der Delphi-Version blöde ... bei den neueren Versionen macht man das ganz charmant über Anonyme Methoden.

Aber so sollte es auch charmant gehen:

Delphi-Quellcode:
type
  TInstError = procedure(const Content: String) of object;
 
  TMyOwnThread = class(TThread)
  private
    FInstError: TInstError;
    // procedure SyncError; @DeddyH: logisch muss die hier raus :o)
    CallError( const Content : string );
  public
    property InstError: TInstError read FInstError write FInstError;
  end;
 
implementation

procedure TMyOwnThread.CallError( const Content : string );
procedure SyncError;
begin
  if Assigned( FInstError )
    then FInstError( Content );
end;
begin
  Synchronize( SyncError );
end;
 
procedure TMyOwnThread.Execute;
begin
  ...
  // Error 1
  CallError( 'Fehler 1' );
  ...
  // Error 2
  CallError( 'Fehler 2' );
  ...
  // Error 3
  CallError( 'Fehler 3' );
 
  usw.
end;


procedure Form1.InstError(const Content: String);
begin
  RichEditError.Lines.Add(Content);
end;

wicht 9. Feb 2011 13:40

AW: Synchronize mit Argumenten
 
Sir Rufo, das ist super!
Ich habe nie daran gedacht, das mit 'Nested'-Methoden zu machen, falls das so heißt. Habe immer 2 direkt in die Klasse gebaut und das fand ich auch immer sehr unschön.

Dankeschön :)

DeddyH 9. Feb 2011 13:41

AW: Synchronize mit Argumenten
 
Müsste die Deklaration von SyncError dann aber nicht aus dem private-Abschnitt verschwinden?

Sir Rufo 9. Feb 2011 13:48

AW: Synchronize mit Argumenten
 
Zitat:

Zitat von wicht (Beitrag 1080524)
Sir Rufo, das ist super!
Ich habe nie daran gedacht, das mit 'Nested'-Methoden zu machen, falls das so heißt. Habe immer 2 direkt in die Klasse gebaut und das fand ich auch immer sehr unschön.

Dankeschön :)

Aber du hast doch mit XE die Möglichkeit der Anonymen Methoden und da gibt es einen sehr charmanten Ansatz von Uwe Raabe

Ich würde aber so gut wie immer statt
Delphi-Quellcode:
Synchronize
den
Delphi-Quellcode:
Queue
verwenden (manchmal muss halt Sync sein, aber beim reinen Abliefern von Informationen ...).
Nur ganz zum Schluss mindestens einmal noch
Delphi-Quellcode:
Synchronize
, damit auch wirklich alles übertragen wird.

Der Vorteil bei
Delphi-Quellcode:
Queue
ist ja, dass zwar synchronisiert wird, aber ohne den laufenden Prozess zu unterbrechen. Bei
Delphi-Quellcode:
Synchronize
wartet beide Threads aufeinander, bis diese synchron laufen, verarbeiten die Informationen und dann geht es für beide erst wieder weiter.

Und warum soll de Thread darauf warten, bis da was auch immer auf den Bildschirm geklatscht werden kann.
Das Fenster ist doch schon groß und kann das ganz alleine :mrgreen:

Zitat:

Zitat von DeddyH (Beitrag 1080525)
Müsste die Deklaration von SyncError dann aber nicht aus dem private-Abschnitt verschwinden?

:oops: jooo ... habs berichtigt

wicht 9. Feb 2011 14:08

AW: Synchronize mit Argumenten
 
Zitat:

Aber du hast doch mit XE die Möglichkeit der Anonymen Methoden und da gibt es einen sehr charmanten Ansatz von Uwe Raabe
Aha, ich war zu voreilig. Habe mir XE gestern bestellt, aber musste mein Profil vorher schon anpassen :-D .. Aber danke für diese Information, werde mich, wenn die Bestellung durch ist, auf jedenfall mal mit den anonymen Methoden auseinandersetzen.

Nochmal Danke und LG

himitsu 9. Feb 2011 15:29

AW: Synchronize mit Argumenten
 
oder Hier im Forum suchenThreadHelper (mit anonymen Methoden ab D2009), bzw. Hier im Forum suchenAsyncCalls

Sir Rufo 9. Feb 2011 21:18

AW: Synchronize mit Argumenten
 
Verflixte Technik ... geht doch nicht, da "Symbol SyncError kann nicht erfasst werden"

Na dann am besten auf XE umsteigen :mrgreen:
Zitat:

Zitat von Sir Rufo (Beitrag 1080523)
Tja, das ist mit der Delphi-Version blöde ... bei den neueren Versionen macht man das ganz charmant über Anonyme Methoden.

Aber so sollte es auch charmant gehen:

Delphi-Quellcode:
type
  TInstError = procedure(const Content: String) of object;
 
  TMyOwnThread = class(TThread)
  private
    FInstError: TInstError;
    // procedure SyncError; @DeddyH: logisch muss die hier raus :o)
    CallError( const Content : string );
  public
    property InstError: TInstError read FInstError write FInstError;
  end;
 
implementation

procedure TMyOwnThread.CallError( const Content : string );
procedure SyncError;
begin
  if Assigned( FInstError )
    then FInstError( Content );
end;
begin
  Synchronize( SyncError );
end;
 
procedure TMyOwnThread.Execute;
begin
  ...
  // Error 1
  CallError( 'Fehler 1' );
  ...
  // Error 2
  CallError( 'Fehler 2' );
  ...
  // Error 3
  CallError( 'Fehler 3' );
 
  usw.
end;


procedure Form1.InstError(const Content: String);
begin
  RichEditError.Lines.Add(Content);
end;



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.
Seite 1 von 5  1 23     Letzte »    

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