AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread für einfache Funktionsauslagerungen

Ein Thema von ibp · begonnen am 20. Jun 2012 · letzter Beitrag vom 20. Jun 2012
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#11

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 14:35
ja das tut der Thread aber nicht, das einzige was ich brauche ist der Zugriff auf den Status von fInProgress.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 14:38
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#13

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 14:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 14:56
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#15

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 18:22
@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
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#16

AW: Thread für einfache Funktionsauslagerungen

  Alt 20. Jun 2012, 19:48
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf