Difference between revisions of "spawn"

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Formatted another user's note for readability.)
m (Text replacement - "|= Game name" to "|Game name=")
 
(28 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{Command|= Comments
+
{{Command|Comments=
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
  
| arma |= Game name
+
| arma |Game name=
  
|1.00|= Game version
+
|1.00|Game version=
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
  
| Starts running a new script ([[SQF]]). Additional arguments are passed in local _this variable.
+
| Adds given set of compiled instructions to the [[Scheduler|scheduler]]. Exactly when the code will be executed is unknown, it depends on how busy is the engine and how filled up is the [[Scheduler|scheduler]]. Therefore [[spawn]] does not wait for the supplied code to finish, instead, [[spawn]] returns a [[Script (Handle)|Script]] handle to the [[Scheduler|scheduler]] task. [[scriptDone]] command can be used to check the code completion. Additional arguments are passed to the code in local variable [[_this]]. Since Arma 3 v1.55 the script handle also exists inside the code in <tt>_thisScript</tt> variable.<br><br>
 
+
To see what spawned scripts are currently in the scheduler, use [[diag_activeSQFScripts]] command.|DESCRIPTION=
The new script is running in parallel, spawn does not wait for it to be done, instead spawn returns a [[Script (Handle)|Script]] handle. |= Description
 
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
  
| [[Script]] <nowiki>=</nowiki> arguments '''spawn''' code |= Syntax
+
| arguments '''spawn''' code |SYNTAX=
  
|p1= arguments: [[Any Value]] |= Parameter 1
+
|p1= arguments: [[Any Value]] - arguments passed to the script, which later available in <tt>_this</tt> variable inside the script. |PARAMETER1=
  
|p2= code: [[Code]] |= Parameter 2
+
|p2= code: [[Code]] |PARAMETER2=
  
| [[Script (Handle)|Script]] |= Return value
+
| [[Script_(Handle)|Script Handle]] - can be used to determine (via [[scriptDone]] (also via [[isNull]] in Arma 3)) when the spawned script has finished. In Arma 3, the handle is also available inside the spawned script in <tt>_thisScript</tt> variable. |RETURNVALUE=
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
 
   
 
   
Line 24: Line 23:
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
 
   
 
   
|x1= <code>[] spawn { player [[globalChat]] "This is run in parallel."; };</code> |= Example 1
+
|x1= <code>_handle = [] [[spawn]] {[[player]] [[globalChat]] "Hello world!"};</code> |EXAMPLE1=
  
 
|x2= There is no guarantee that spawned scripts will be executed in the same order they spawned:  
 
|x2= There is no guarantee that spawned scripts will be executed in the same order they spawned:  
<code>[[for]] "_i" [[from]] 0 [[to]] 100 [[do]] {
+
<code>[[for]] "_i" [[from]] 0 [[to]] 100 [[do]]  
_null = _i [[spawn]] {
+
{
[[diag_log]] _this
+
_null = _i [[spawn]]  
}
+
{
}</code>
+
[[diag_log]] _this;
Result: 51,1,2...49,50,0,52,53...100 |= Example 2
+
};
 +
};</code>
 +
// Result: 51,1,2...49,50,0,52,53...100 |EXAMPLE2=
 
____________________________________________________________________________________________
 
____________________________________________________________________________________________
  
| [[call]], [[compile]], [[preprocessFileLineNumbers]], [[preprocessFile]], [[terminate]], [[scriptDone]] |= See also
+
| [[call]], [[execVM]], [[execFSM]], [[exec]], [[compile]], [[preprocessFileLineNumbers]], [[preprocessFile]], [[terminate]], [[scriptDone]], [[remoteExec]], [[sleep]], [[uiSleep]], [[canSuspend]] |SEEALSO=
  
 
}}
 
}}
Line 47: Line 48:
 
[[spawn]] cannot call other local functions on the same scope as itself.<br>
 
[[spawn]] cannot call other local functions on the same scope as itself.<br>
 
It can, however, call other global functions:
 
It can, however, call other global functions:
<pre style="border:none;">_addOne = {TST=TST+1};
+
<code>_addOne = {TST=TST+1};
 
TST_addOne = {TST=TST+1};
 
TST_addOne = {TST=TST+1};
  
 
_add = {
 
_add = {
 
     TST=TST+1;
 
     TST=TST+1;
     player sidechat format["added: %1",TST];
+
     [[player]] [[sideChat]] [[format]] ["added: %1",TST];
     [] call _addOne;
+
     [] [[call]] _addOne;
     player sidechat format["called local: %1",TST];
+
     [[player]] [[sideChat]] [[format]] ["called local: %1",TST];
     [] call TST_addOne;
+
     [] [[call]] TST_addOne;
     player sidechat format["called global: %1",TST];
+
     [[player]] [[sideChat]] [[format]] ["called global: %1",TST];
 
};
 
};
 
TST=0;
 
TST=0;
[] call _add;
+
[] [[call]] _add;
[] spawn _add;</pre>
+
[] [[spawn]] _add;</code>
* The call of _addOne from the spawned function does not do anything.
+
The call of _addOne from the spawned function does not do anything.
  
 
<!-- Note Section END -->
 
<!-- Note Section END -->
Line 74: Line 75:
 
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
 
[[Category:Command Group: Program Flow|{{uc:{{PAGENAME}}}}]]
 
[[Category:Command Group: Program Flow|{{uc:{{PAGENAME}}}}]]
 +
 +
<!-- CONTINUE Notes -->
 +
<dl class="command_description">
 +
<dd class="notedate">Posted on October 21, 2014 - 23:33 (UTC)</dd>
 +
<dt class="note">[[User:DreadedEntity|DreadedEntity]]</dt>
 +
<dd class="note">
 +
[[spawn]] requires a script handle when used in the 2D editor. '''(A3)'''<br>
 +
In scripts and in the debug console, it is not required, but very useful for keeping track of running scripts. Having a script handle also makes it easy to [[terminate]] scripts at any time.
 +
<br><br>
 +
Since [[spawn]] creates a new [[Scheduler#Scheduled_Environment|scheduled environment]], having an excess of open [[Scheduler#Threads|threads]] can make the [[Scheduler#Scheduler|scheduler]] queue extremely long, significantly increasing the execution time of each [[Scheduler#Threads|thread]]. (it takes an extremely large amount of [[Scheduler#Threads|threads]], though)
 +
</dd>
 +
</dl>
 +
<!-- DISCONTINUE Notes -->
 +
 +
<!-- CONTINUE Notes -->
 +
<dl class="command_description">
 +
<dd class="notedate">Posted on August 25, 2015 - 13:39 (UTC)</dd>
 +
<dt class="note">[[User:IT07|IT07]]</dt>
 +
<dd class="note">
 +
If you want to call a local function which has NOT been created inside a spawned function, then do this:
 +
<code>_fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;</code>
 +
</dd>
 +
</dl>
 +
<!-- DISCONTINUE Notes -->

Latest revision as of 23:21, 1 September 2019

Introduced with Armed Assault version 1.00
  

Click on the images for descriptions

Introduced in

Game:
Armed Assault
Version:
1.00

Description

Description:
Adds given set of compiled instructions to the scheduler. Exactly when the code will be executed is unknown, it depends on how busy is the engine and how filled up is the scheduler. Therefore spawn does not wait for the supplied code to finish, instead, spawn returns a Script handle to the scheduler task. scriptDone command can be used to check the code completion. Additional arguments are passed to the code in local variable _this. Since Arma 3 v1.55 the script handle also exists inside the code in _thisScript variable.

To see what spawned scripts are currently in the scheduler, use diag_activeSQFScripts command.

Syntax

Syntax:
arguments spawn code
Parameters:
arguments: Any Value - arguments passed to the script, which later available in _this variable inside the script.
code: Code
Return Value:
Script Handle - can be used to determine (via scriptDone (also via isNull in Arma 3)) when the spawned script has finished. In Arma 3, the handle is also available inside the spawned script in _thisScript variable.

Examples

Example 1:
_handle = [] spawn {player globalChat "Hello world!"};
Example 2:
There is no guarantee that spawned scripts will be executed in the same order they spawned: for "_i" from 0 to 100 do { _null = _i spawn { diag_log _this; }; }; // Result: 51,1,2...49,50,0,52,53...100

Additional Information

Multiplayer:
-
See also:
callexecVMexecFSMexeccompilepreprocessFileLineNumberspreprocessFileterminatescriptDoneremoteExecsleepuiSleepcanSuspend

Notes

Only post proven facts here. Report bugs on the feedback tracker. Use the talk page or the forums for discussions.
Add New Note | How To

Notes

Posted on 5 March, 2009
Kronzky
spawn cannot call other local functions on the same scope as itself.
It can, however, call other global functions: _addOne = {TST=TST+1}; TST_addOne = {TST=TST+1}; _add = { TST=TST+1; player sideChat format ["added: %1",TST]; [] call _addOne; player sideChat format ["called local: %1",TST]; [] call TST_addOne; player sideChat format ["called global: %1",TST]; }; TST=0; [] call _add; [] spawn _add; The call of _addOne from the spawned function does not do anything.

Bottom Section

Posted on October 21, 2014 - 23:33 (UTC)
DreadedEntity
spawn requires a script handle when used in the 2D editor. (A3)
In scripts and in the debug console, it is not required, but very useful for keeping track of running scripts. Having a script handle also makes it easy to terminate scripts at any time.

Since spawn creates a new scheduled environment, having an excess of open threads can make the scheduler queue extremely long, significantly increasing the execution time of each thread. (it takes an extremely large amount of threads, though)
Posted on August 25, 2015 - 13:39 (UTC)
IT07
If you want to call a local function which has NOT been created inside a spawned function, then do this: _fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;