![]() |
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.
|
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 :-(
|
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. |
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 |
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:
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.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; Gruß NickelM |
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 22:20 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-2025 by Thomas Breitkreuz