ServiceState: interface between SCM and APL

(Hide table-of-contents)

ServiceState is part of the CategoryAplTree project.


ServiceState is a namespace script that offers an interface between the Windows SCM (Service Control Manager) and a Dyalog APL application running as a service.

In you application workspace you need to have a function on ⎕LX similar to this:

[1]      ps←#.ServiceState.CreateParmSpace
[2]      ps.ride←1
[3]      #.ServiceState.Init ps
[4]   :If #.ServiceState.IsRunningAsService
[5]      {#.TestService.Run ⍵}&⍬
[6]      ⎕DQ'.'
[7]     #.TestService.Off
[8]  :Else
[9]     #.TestService.Run ⍬
[10] :EndIf

Note that this example focuses on getting the application running as a service. For the purpose of demonstrating how to overwrite defaults (no RIDE) it shows how to create a parameter space with default settings (line [1]) and then overwrite a setting (line [2]).

If you are happy with the defaults (which you can check by executing #.ServiceState.CreateParmSpace.∆List) then you can specify as the right argument of #.ServiceState.Init in line [3].


[4]: Checks whether the application is actually running as a Windows Service. This allows to execute the application in its own thread in case its running as a service but not otherwise - that makes debugging the application significantly easier.

[5]: Here we start the real application. Note that this must run in its own thread because otherwise the application might well become unresponsive.

[6]: We need to execute ⎕DQ '.' in order to make sure that the interpreter processes all events.

[7]: At this stage we need to execute ⎕OFF; that's what #.TestService.Off is doing.

The application

The application must make sure in its main loop that it checks for state changes, and act accordingly. This is all done by the Operator #.ServiceState.CheckServiceMessages which takes the name of a logging function as operand:

  MainLoop dummmy;buffer;data;event;obj;rc;r;msg;cs
[1]   :Repeat
[2]       ⎕DL 1                     ⍝ What is reasonable here depends on the application
[3]       :If (Log #.ServiceState.CheckServiceMessages)#.ServiceState.IsRunningAsService
[4]           Log'The service is in the process of shutting down...'
[5]           :Leave
[6]       :EndIf
[7]   :Until 0


Line [3] checks for any changes signalled from the Service Control Manager (SCM). If a "Pause" is detected, then the function loops until either a "Continue" or a "Stop" is detected. The explicit result is 1 in case a "Stop" is detected and 0 otherwise.

APLTree downloads

Using an APLTree member

  1. If you just want to consume (use) an APLTree member then you have several choices:

* Access it via FTP: with the user ID "anonymous". There is no password needed.

  • Note that accessing it via ftp allows you to download older versions as well while the dedicated download page offers just the most current version.
  • Download any release since the conversion to GitHub (2018-02) from GitHub. You can compile the URL by{name}


If you want to contribute to an APLTree project see HowToContributeToTheAPLTreeProject for details.

Get the full project

If for some reason you need access to, say, the test cases then you need to get more then just the script (or application) itself.

HowToContributeToTheAPLTreeProject explains how to get a project onto your local machine. Just ignore any additional steps.

Create a new APLTree sub project

In order to create a new APLTree project you need some advice. Ask KaiJaeger for help:


ServiceState (last edited 2018-02-19 15:41:59 by KaiJaeger)