Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Thread für einfache Funktionsauslagerungen (https://www.delphipraxis.net/168952-thread-fuer-einfache-funktionsauslagerungen.html)

ibp 20. Jun 2012 13:35

AW: Thread für einfache Funktionsauslagerungen
 
ja das tut der Thread aber nicht, das einzige was ich brauche ist der Zugriff auf den Status von fInProgress.

ChrisE 20. Jun 2012 13:38

AW: Thread für einfache Funktionsauslagerungen
 
Irgendwie stehe ich auf dem Schlauch. Du Fragst doch bereits über die Property des Threads diese Variable im Hauptthread ab. Sorry, ich versteh die Frage an sich nicht :-(

ibp 20. Jun 2012 13:45

AW: Thread für einfache Funktionsauslagerungen
 
ich frage das Property während des ganzen Prozesses ab, während die DB-SP läuft, damit ich dann so lange das Infofenster updaten kann.

Die fRage ist ja wenn ich im Excute Teil sich das Property ändert, brauche ich dann ein Synchronize, damit ich im Hauptthread die Änderung des Propertys mitbekomme.

ChrisE 20. Jun 2012 13:56

AW: Thread für einfache Funktionsauslagerungen
 
aus meiner Sicht musst du das nicht. Ich lasse mich aber gerne belehren.
Syncronize sorgt nur dafür, dass der Code im Kontext des MainThreads ausgeführt wird. Da du aber in Execute nur eine Variable auf False setzt und diese per Property im MainThread immer wieder abgefragt wird sehe ich da eigentlich kein Problem. Es greifen zwei Threads auf einen Speicherbereich zu, aber der eine eben nur lesend (durch Property sicher gestellt).

Wenn du auf Nummer sicher gehen willst, kannst du für die Variable Getter und Setter schreiben, die die Variable per CriticalSection absichern.

Gruß, Chris

NickelM 20. Jun 2012 17:22

AW: Thread für einfache Funktionsauslagerungen
 
@ChrisE : Er meinte, wie ich das mit meinem Post bezüglich Synchronize meinte.
@ibp : Okay hab mich zugegeben bischen doff ausgedrückt. Ich meinte, dass du das alles ein bischen anders aufbauen kannst, und somit kein Sleep oder sonstiges mehr brauchst.

Delphi-Quellcode:
 
TMachWasLangesInDerDBThread = class(TThread)
    private
      ...
      FErrorMsg : String; //Da man keine Funktion mit Parameter synchronizieren kann
      procedure OnErrorDo;
      procedure OnFinishDo;
    protected
      procedure Execute; override;
    public
   ...
  end;

procedure TMachWasLangesInDerDBThread.Execute;
begin
  try
    fSPQuery.ExecSQL;
  except
    on e: exception do
    begin
      FErrorMsg := e.Message;
      Synchronize(OnErrorDo);
      Terminate; //Zur Sicherheit
    end;
  end;
  Synchronize(OnFinishDo);
  Terminate; //Zur Sicherheit
end;

procedure TMachWasLangesInDerDBThread.OnErrorDo;
begin
  ShowMessage(FErrorMsg);
  //OnFinishDo; oder was du beim Error sonst nach alles gemacht hättest.
end;

procedure TMachWasLangesInDerDBThread.OnFinishDo;
begin
  //z.b. MeinInfoFenster.hide; oder was du nach deiner Schleife gemacht hättest
end;

.... im Hauptprozess Aufruf durch...

...
MeinInfoFenster.show;
aMYThread := TMachWasLangesInDerDBThread.create(...);
aMYThread.FreeOnTerminate := True;
So habe ich dass immer gelöst, wenn ich auf einen Thread warten musste. Damit bleibt das Fenster, wenn überhaupt, nur beim Synchronize-Teil kurz hängen, da beide Thread ja zusammen arbeiten.

Gruß NickelM

Furtbichler 20. Jun 2012 18:48

AW: Thread für einfache Funktionsauslagerungen
 
Ich verwende einen Connectionpool, der mir TIBDatabase-Componenten bereit hält.

Die Threads haben eine lokale im Thread erzeugte TIBStoredProc-Instanz. Beim Ausführen fordern sie eine Connection an, weisen sie der SP zu, führen sie aus und geben die Connection wieder an den Pool zurück.

Der Pool verwaltet nur eine TThreadList if TIBDatabase. Wenn eine Verbindung angefordert wird, aber die Liste leer ist, wird eine neue erstellt.

Keine Ahnung, ob das sinnig ist, aber ich habe es mal so umgesetzt und das läuft sehr gut. Ich verwende das für eine Datenpumpe, wobei die Threads als Workerthread fungieren.

Ich würde außerdem zusehen, das die SP nicht allzulange braucht. Wenn sie das tut, hast Du vermutlich etwas falsch gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Seite 2 von 2     12   

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