Stopping the submodel execution
If a submodel execution takes a long time it may be desirable to interrupt the submodel without stopping the master model itself. The following modified version of our master model (file runsubwait.mos) shows how this can be achieved by adding a duration (in seconds) to the wait statement. If the submodel has not yet sent the termination event message after executing for one second it is stopped by the call to stop with the model reference.
model "Run model testsub" uses "mmjobs" declarations modSub: Model end-declarations ! Compile the model file if compile("testsub.mos")<>0 then exit(1); end-if load(modSub, "testsub.bim") ! Load the bim file run(modSub) ! Start model execution wait(1) ! Wait 1 second for an event if isqueueempty then ! No event has been sent: model still runs writeln_("Stopping the submodel") stop(modSub) ! Stop the model wait ! Wait for model termination end-if dropnextevent ! Ignore termination event message end-model
A more precise time measurement can be obtained by retrieving a "model ready" user event from the submodel before we begin to wait for a given duration. With heavy operating system loads the actual submodel start may be delayed, and the event sent by the submodel tells the master model the exact point of time when its processing is started. Class codes for user events can take any integer value greater than 1 (values 0 and 1 are reserved respectively for the nullevent and the predefined class EVENT_END).
model "Run model testsub" uses "mmjobs" declarations modSub: Model ev: Event SUBMODREADY = 2 ! User event class code end-declarations ! Compile the model file if compile("testsubev.mos")<>0 then exit(1); end-if load(modSub, "testsubev.bim") ! Load the bim file run(modSub) ! Start model execution wait ! Wait for an event if getclass(getnextevent) <> SUBMODREADY then writeln_("Problem with submodel run") exit(1) end-if wait(1) ! Let the submodel run for 1 second if isqueueempty then ! No event has been sent: model still runs stop(modSub) ! Stop the model wait ! Wait for model termination end-if ev:=getnextevent ! An event is available: model finished writeln_("Event class: ", getclass(ev)) writeln_("Event value: ", getvalue(ev)) writeln_("Exit code : ", getexitcode(modSub)) end-model
The modified submodel testsubev.mos now looks as follows. The user event class must be the same as in the master model. In this example we are not interested in the value sent with the event and therefore simply leave it at 0.
model "Test submodel (Event)" uses "mmjobs" declarations SUBMODREADY = 2 ! User event class code end-declarations send(SUBMODREADY, 0) ! Send "submodel ready" event forall(i in 10..20) write(i^2, " ") writeln end-model
© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.