Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigener Dienst beendet nicht korrekt... (https://www.delphipraxis.net/127539-eigener-dienst-beendet-nicht-korrekt.html)

cherry 30. Apr 2009 12:27

Re: Eigener Dienst beendet nicht korrekt...
 
Zitat:

Zitat von nahpets
Bei Deiner Variante werden die Threads wohl von außen gestoppt und Du musst sicherstellen, dass sie auf das Beenden auch zeitnah reagieren. Besteht da nicht eventuell die Gefahr, dass Du das Problem auf eine andere Stelle verschiebst, wenn gerade in einem Thread eine For-Schleife abgearbeitet wird. Ist da sichergestellt, das der Thread auch "mitten" in der For-Schleife beendet wird. Besteht da dann die Möglichkeit, dass inkonsistente Daten übrig bleiben?

das würde dann genau so sein... nur lieber da als anderswo ;-) vermeiden kann mann das ja sowieso nicht, dass gewisse aktionen inmitten unterbrochen werden müssen.

Zitat:

Zitat von nahpets
Meine (subjektive) Meinung ist: Über einen Schalter kontrolliert aus einer Routine aussteigen, um noch eine bestehende Aufgabe abzuschließen.

naja, irgendwie kann ich mich mit dieser methode auch nicht wirlklich anfreunden, ist irgendwie unschön. Diese Abfrage müsste dann ca. 30-Mal irgendwo in meinem Code stehen und da graut mir irgendwie davon. Nundenn, wenn das die Offizielle Lösung ist mache ich das gerne so. Ich würde aber auch noch gerne ein paar andere Meinungen hören, ich kann mir irgendwie nicht vorstellen, dass ich der Einzige bin der schon mal vor diesem Problem gestanden ist. :gruebel:

Zitat:

Zitat von nahpets
Du gehst ja im Prinzip her und beendest die Threads nacheinander. Der zweite Thread erfährt also erst nach dem erfolgreichen Beenden des ersten Threads, dass er sich beenden soll, der Dritte nach dem Zweiten....

TerminateThread teilt dem Betriebssystem mit, das der Thread beendet werden soll und kehrt dann zurück, von dem her sollte das eigentlich gehen...

Zitat:

Zitat von nahpets
Bei einem anderen Dienst habe ich kürzlich (zufällig) festgestellt, dass Windows 30 Sekunden wartet, bevor es einen Dienst "mit der Keule" erschlägt.

und wie hast du die Problematik anschliessend gelöst?

nahpets 30. Apr 2009 13:19

Re: Eigener Dienst beendet nicht korrekt...
 
Zitat:

Zitat von cherry
Zitat:

Zitat von nahpets
Meine (subjektive) Meinung ist: Über einen Schalter kontrolliert aus einer Routine aussteigen, um noch eine bestehende Aufgabe abzuschließen.

naja, irgendwie kann ich mich mit dieser methode auch nicht wirlklich anfreunden, ist irgendwie unschön. Diese Abfrage müsste dann ca. 30-Mal irgendwo in meinem Code stehen und da graut mir irgendwie davon. Nundenn, wenn das die Offizielle Lösung ist mache ich das gerne so. Ich würde aber auch noch gerne ein paar andere Meinungen hören, ich kann mir irgendwie nicht vorstellen, dass ich der Einzige bin der schon mal vor diesem Problem gestanden ist. :gruebel:

Ne, bist bestimmt nicht der Einzige aber vermutlich gibt es "die" Lösung nicht. Meine Lösung ist sicherlich nicht gerade elegant, wohl auch kaum als objektorientiert zu bezeichnen, brachte aber mit vertretbarem Aufwand die erwünschte Lösung. Aber das kommt dann sicherlich auf den Einzelfall an. Wenn Du so eine Lösung nur implementieren kannst mit einer Unmenge von zusätzlichen Abfragen, dann ist das bestenfalls als suboptimal zu bezeichnen.
Zitat:

Zitat von cherry
Zitat:

Zitat von nahpets
Du gehst ja im Prinzip her und beendest die Threads nacheinander. Der zweite Thread erfährt also erst nach dem erfolgreichen Beenden des ersten Threads, dass er sich beenden soll, der Dritte nach dem Zweiten....

TerminateThread teilt dem Betriebssystem mit, das der Thread beendet werden soll und kehrt dann zurück, von dem her sollte das eigentlich gehen...

D. h. aber, dass der Thread mehr oder weniger "unkontrolliert" beendet wird und ein Datenbankzugriff eventuell "mittendrin" abgebrochen wird. Es könnte also sein, dass Transaktionen weder mit Commit noch mit Rollback beendet werden? Stelle mir das immer so vor wie: Datenbankapplikation per Taskmanager beenden. Das ist etwas, das ich äußerst ungerne mache.
Zitat:

Zitat von cherry
Zitat:

Zitat von nahpets
Bei einem anderen Dienst habe ich kürzlich (zufällig) festgestellt, dass Windows 30 Sekunden wartet, bevor es einen Dienst "mit der Keule" erschlägt.

und wie hast du die Problematik anschliessend gelöst?

Garnicht, da war auf dem Rechner so Allerlei abgestürzt und hatte sich gegenseitig in die Knie gezwungen, habe nicht herausgefunden, was da die eigentliche Ursache des Problemes war. Vermutlich aber der Neustart eines anderen Servers, auf dessen Datenbanken zu diesem Zeitpunkt zugegriffen wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.
Seite 4 von 4   « Erste     234   

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