Daemon Beispiel
-
- Beiträge: 5
- Registriert: Sa 13. Okt 2012, 14:25
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Wahlstedt
Daemon Beispiel
hier wie auf dem Lazarustreffen 2012 abgesprochen mein kleines Daemon Beispiel.
Ich habe noch eine kleine App zum testen fertig gemacht.
Würde mich freuen, wenn ich damit jemandem weiterhelfen kann.
Lieben Gruß
Sascha
Zuletzt geändert von Saschko am Do 18. Okt 2012, 09:01, insgesamt 2-mal geändert.
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: Daemon Beispiel
Willkommen im Forum 
Hat sich dann eigentlich noch eine funktionierende und allgemein existierende Loesung zu Terminate, WaitFor und Destroy ergeben?

Hat sich dann eigentlich noch eine funktionierende und allgemein existierende Loesung zu Terminate, WaitFor und Destroy ergeben?
-
- Beiträge: 5
- Registriert: Sa 13. Okt 2012, 14:25
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Wahlstedt
Re: Daemon Beispiel
Ich dachte ich hätte die Lösung. Aber nachdem du gefragt hast,
hab ich nochmal gestestet. Und ... verdammt geht noch nicht.
Werd nachher noch mal reinschauen, und meine Ergebnisse dann nochmals hochladen und
beschreiben.
hab ich nochmal gestestet. Und ... verdammt geht noch nicht.
Werd nachher noch mal reinschauen, und meine Ergebnisse dann nochmals hochladen und
beschreiben.
-
- Beiträge: 5
- Registriert: Sa 13. Okt 2012, 14:25
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Wahlstedt
Re: Daemon Beispiel
Wenn ich das jatzt richtig verstanden habe, wird der Thread im DataModuleStop auf die harte Tour
beendet, es sei denn man gönnt ihm hier noch etwas Zeit um sich sauber beenden zu können.
Das mit Sleep zu machen ist meiner Meinung nach nicht ganz sauber (Hab es aus der CleanDirs Demo übernommen).
Aber WaitFor wartet leider endlos. Sollte sich der Thread also nie aus der Execute raus kommen,
warten wir hier ewig. Evtl. sollte man beim WaitFor die Millisekunden mit übergeben.
Ich könnte das aber leider nur für die WinAPI implementieren, also erstmal mit Sleep.
Über Anregungen und Vorschläge würde ich mich freuen.
Bis dahin
Sascha
beendet, es sei denn man gönnt ihm hier noch etwas Zeit um sich sauber beenden zu können.
Das mit Sleep zu machen ist meiner Meinung nach nicht ganz sauber (Hab es aus der CleanDirs Demo übernommen).
Aber WaitFor wartet leider endlos. Sollte sich der Thread also nie aus der Execute raus kommen,
warten wir hier ewig. Evtl. sollte man beim WaitFor die Millisekunden mit übergeben.
Ich könnte das aber leider nur für die WinAPI implementieren, also erstmal mit Sleep.
Über Anregungen und Vorschläge würde ich mich freuen.
Bis dahin
Sascha
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Daemon Beispiel
Vielen Dank für das Tolle Beispiel.
Ich habe mich mit dem Stopp Problem befasst und es glaube ich auch lösen können. Es ist ganz einfach: In der Klasse TMeinDaemon muss die Methode ShutDown Überschrieben werden. Dort kann der TMeinServiceThread freigegeben werden und dann wird ins Log auch Ende geschrieben. Jedenfalls Funktioniert es so unter Linux/Debian(Ubuntu). Vielleicht klappt es auch so unter Windows.
Wenn ich nichts Falsch verstanden habe. Unter Linux verwende ich zum Steuern(Start, Stopp und Restart) des daemon ein Shell Script.
Edit01: Es gibt sogar ein Extra Thread: TDaemonThread. Ich weiß nicht, ob man den eher nutzten sollte/könnte. Erste Versuche scheiterten, jedenfalls. Aber ich glaube für mein Vorhaben, ist das kleine Beispiel sehr gut geeignet. Hoffe ich jedenfalls.
Ich habe mich mit dem Stopp Problem befasst und es glaube ich auch lösen können. Es ist ganz einfach: In der Klasse TMeinDaemon muss die Methode ShutDown Überschrieben werden. Dort kann der TMeinServiceThread freigegeben werden und dann wird ins Log auch Ende geschrieben. Jedenfalls Funktioniert es so unter Linux/Debian(Ubuntu). Vielleicht klappt es auch so unter Windows.
Wenn ich nichts Falsch verstanden habe. Unter Linux verwende ich zum Steuern(Start, Stopp und Restart) des daemon ein Shell Script.
Edit01: Es gibt sogar ein Extra Thread: TDaemonThread. Ich weiß nicht, ob man den eher nutzten sollte/könnte. Erste Versuche scheiterten, jedenfalls. Aber ich glaube für mein Vorhaben, ist das kleine Beispiel sehr gut geeignet. Hoffe ich jedenfalls.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: Daemon Beispiel
Hallo Sascha,Saschko hat geschrieben:Wenn ich das jatzt richtig verstanden habe, wird der Thread im DataModuleStop auf die harte Tour
beendet, es sei denn man gönnt ihm hier noch etwas Zeit um sich sauber beenden zu können.
Das mit Sleep zu machen ist meiner Meinung nach nicht ganz sauber (Hab es aus der CleanDirs Demo übernommen).
Aber WaitFor wartet leider endlos. Sollte sich der Thread also nie aus der Execute raus kommen,
warten wir hier ewig. Evtl. sollte man beim WaitFor die Millisekunden mit übergeben.
Ich könnte das aber leider nur für die WinAPI implementieren, also erstmal mit Sleep.
Über Anregungen und Vorschläge würde ich mich freuen.
Bis dahin
Sascha
probier es mal den Thread mit FreeOnTerminate anzulegen, wenn er dann mit Terminate beendet wird kannst Du mit WaitFor warten, so wird auch Execute korrekt beendet.
Code: Alles auswählen
FThread := TThread.Create(true);
FThread.FreeOnTerminate := true;
FThread.Resume;
FThread.Terminate;
FThread.WaitFor;
FThread := nil;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
-
- Beiträge: 199
- Registriert: Di 20. Okt 2015, 23:13
Re: Daemon Beispiel
Schönes Beispiel. Auch für Einsteiger in das Thema übersichtlich und verständlich. Auch wenn ich mir auch nach Studium des Quellcodes noch nicht erklären kann, warum der Dienst nicht anläuft. Dazu ist es wohl dann doch nötig, mich ein wenig in die Materie einzuarbeiten.
Kann da jemand eine gute Doku empfehlen?
Ich könnte einen Dienst gebrauchen, der bei Hardwarefehlern, möglichst noch vor dem wahrscheinlichen Absturz Daten sichert und runter fährt, am besten mit einem Meldungsfenster vorher noch.
Da ich hier noch Windows XP nutze, hatte ich schon Programmversionen die auf diesem System nicht mehr laufen. Ich bekommen dann eine Fehlermeldung der Art "Prozedureinsprungspunkt in xxx.dll nicht gefunden.
Wenn das nur wenige API Funktionen beträfe, die da fehlen. hätte ich gerne einen Dienst, der dann auf eine von mir geschriebene API Funktion umleitet und diese anstelle der in späteren Windowas Versionen vorhandenen API Funktionen aufruft. Sagen wir, wenn das nur eine einzige Funktion oder zwei oder höchstens drei beträfe. Wenn es mehr werden geht wohl ein Update schneller.
Kann da jemand eine gute Doku empfehlen?
Ich könnte einen Dienst gebrauchen, der bei Hardwarefehlern, möglichst noch vor dem wahrscheinlichen Absturz Daten sichert und runter fährt, am besten mit einem Meldungsfenster vorher noch.
Da ich hier noch Windows XP nutze, hatte ich schon Programmversionen die auf diesem System nicht mehr laufen. Ich bekommen dann eine Fehlermeldung der Art "Prozedureinsprungspunkt in xxx.dll nicht gefunden.
Wenn das nur wenige API Funktionen beträfe, die da fehlen. hätte ich gerne einen Dienst, der dann auf eine von mir geschriebene API Funktion umleitet und diese anstelle der in späteren Windowas Versionen vorhandenen API Funktionen aufruft. Sagen wir, wenn das nur eine einzige Funktion oder zwei oder höchstens drei beträfe. Wenn es mehr werden geht wohl ein Update schneller.