Daemon Beispiel

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Saschko
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

Beitrag von Saschko »

DienstBeispiel.zip
(1.18 MiB) 282-mal heruntergeladen
Hallo Leute,

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.

Eclipticon
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

Beitrag von Eclipticon »

Willkommen im Forum ;-)

Hat sich dann eigentlich noch eine funktionierende und allgemein existierende Loesung zu Terminate, WaitFor und Destroy ergeben?

Saschko
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

Beitrag von Saschko »

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.

Saschko
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

Beitrag von Saschko »

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

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Daemon Beispiel

Beitrag von pluto »

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.
MFG
Michael Springwald

gocher
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

Beitrag von gocher »

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

Hallo 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;     
 

Mein Daemon Beispiel findest Du unter http://www.lazarusforum.de/viewtopic.php?f=55&t=5495&p=55766#p55766
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

fpGUIcoder
Beiträge: 199
Registriert: Di 20. Okt 2015, 23:13

Re: Daemon Beispiel

Beitrag von fpGUIcoder »

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.

Antworten