
Der Source sollte leicht verständlich sein.
Code: Alles auswählen
; Daemon Daten
Structure DAEMON_Data
Program$
Para$
Path$
Stop.i
EndStructure
; Daemon arbeiter
Procedure DAEMON_Worker(*Daemon.DAEMON_Data)
Protected hProg
With *DAEMON
Repeat
; Stop - Flag, wir beenden ...
If \Stop
SignalSemaphore(\Stop)
ProcedureReturn #True
EndIf
; Programm starten ...
hProg = RunProgram(\Program$, \Para$, \Path$, #PB_Program_Open)
If Not IsProgram(hProg)
Break
EndIf
; Läuft das Programm noch?
While ProgramRunning(hProg)
Delay(100)
If \Stop
SignalSemaphore(\Stop)
ProcedureReturn #True
EndIf
Wend
ForEver
; Auf das Beenden warten
Repeat
Delay(10)
Until \Stop
SignalSemaphore(\Stop)
EndWith
EndProcedure
; Daemon starten
Procedure DAEMON_Start(Program$, Para$ = "", Path$ = "")
Protected *DAEMON.DAEMON_Data = AllocateMemory(SizeOf(DAEMON_Data))
InitializeStructure(*DAEMON, DAEMON_Data)
With *DAEMON
; Parameter erstellen
\Program$ = Program$
\Para$ = Para$
If Not Path$
\Path$ = GetPathPart(Program$)
Else
\Path$ = Path$
EndIf
CreateThread(@DAEMON_Worker(), *DAEMON)
EndWith
EndProcedure
; Daemon beenden
Procedure DAEMON_Stop(*Daemon.DAEMON_Data)
With *Daemon
; Daemon beenden
\Stop = CreateSemaphore()
WaitSemaphore(\Stop)
FreeSemaphore(\Stop)
; Daemon Freigeben
ClearStructure(*Daemon, DAEMON_Data)
FreeMemory(*Daemon)
EndWith
EndProcedure
DAEMON_Start("cmd")
Repeat
Delay(10)
ForEver