Difference between revisions of "spawn"

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "\|s([0-9])\= ([^' ]+)'''([^' ]+)'''([^ ]*) " to "|s$1= $2$3$4 ")
 
(62 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{Command|= Comments
+
{{RV|type=command
____________________________________________________________________________________________
 
  
| arma |= Game name
+
|game1= ofpe
 +
|version1= 1.00
  
|1.00|= Game version
+
|game2= arma1
____________________________________________________________________________________________
+
|version2= 1.00
  
| Adds given code 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)|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.|= Description
+
|game3= arma2
____________________________________________________________________________________________
+
|version3= 1.00
  
| arguments '''spawn''' code |= Syntax
+
|game4= arma2oa
 +
|version4= 1.50
  
|p1= arguments: [[Any Value]] - arguments passed to the script, which later available in <tt>_this</tt> variable inside the script. |= Parameter 1
+
|game5= tkoh
 +
|version5= 1.00
  
|p2= code: [[Code]] |= Parameter 2
+
|game6= arma3
 +
|version6= 0.50
  
| [[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. |= Return value
+
|gr1= Program Flow
____________________________________________________________________________________________
 
 
 
  
____________________________________________________________________________________________
+
|descr= 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 [[Magic Variables#this|_this]]. Since Arma 3 v1.55 the script handle also exists inside the code in <tt>_thisScript</tt> variable. To see what spawned scripts are currently in the scheduler, use [[diag_activeSQFScripts]] command.{{Feature|Warning| When multiple [[Code]] is [[spawn]]ed in an order, there is <u>no guarantee</u> that the [[spawn]]ed [[Code]] will also execute in the same order. If you need such guarantee, use [[BIS_fnc_spawnOrdered]] function}}
 
+
 
|x1= <code>_handle = [] [[spawn]] {[[player]] [[globalChat]] "Hello world!"};</code> |= Example 1
+
|s1= arguments [[spawn]] code
 +
 
 +
|p1= arguments: [[Anything]] - arguments passed to the script, which later available in <tt>_this</tt> variable inside the script.
 +
 
 +
|p2= code: [[Code]]
 +
 
 +
|r1=[[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.
 +
 
 +
|x1= <code>_handle = [] [[spawn]] {[[player]] [[globalChat]] "Hello world!"};</code>
  
 
|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:  
Line 31: Line 40:
 
[[diag_log]] _this;
 
[[diag_log]] _this;
 
};
 
};
 +
}; {{cc|Result: 51,1,2...49,50,0,52,53...100}}</code>
 +
 +
|x3= Local variables declared in the main scope are not available in the spawned code. You have to pass them as parameters:
 +
<code>[[private]] _localVariable = 1234;
 +
[_localVariable] [[spawn]]
 +
{
 +
[[systemChat]] [[format]] ["_localVariable does not exist: %1", [[isNil]] "_localVariable"]; {{cc|_localVariable does not exist: true}}
 +
[[params]] ["_localVariable"];
 +
[[systemChat]] [[format]] ["My _localVariable is now: %1", _localVariable]; {{cc|My _localVariable is now: 1234}}
 
};</code>
 
};</code>
// Result: 51,1,2...49,50,0,52,53...100 |= Example 2
 
____________________________________________________________________________________________
 
 
| [[call]], [[execVM]], [[execFSM]], [[exec]], [[compile]], [[preprocessFileLineNumbers]], [[preprocessFile]], [[terminate]], [[scriptDone]], [[remoteExec]], [[sleep]], [[uiSleep]], [[canSuspend]] |= See also
 
  
 +
|seealso= [[call]], [[execVM]], [[execFSM]], [[exec]], [[compile]], [[preprocessFileLineNumbers]], [[preprocessFile]], [[terminate]], [[scriptDone]], [[remoteExec]], [[sleep]], [[uiSleep]], [[canSuspend]]
 
}}
 
}}
  
<h3 style="display:none">Notes</h3>
 
 
<dl class="command_description">
 
<dl class="command_description">
<!-- Note Section BEGIN -->
+
 
<dd class="notedate">Posted on 5 March, 2009  
+
<dt></dt>
<dt class="note">[[User:Kronzky|Kronzky]]
+
<dd class="notedate">Posted on 5 March, 2009 </dd>
 +
<dt class="note">[[User:Kronzky|Kronzky]]</dt>
 
<dd class="note">  
 
<dd class="note">  
 
[[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>
Line 63: Line 78:
 
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 -->
 
 
</dl>
 
</dl>
  
<h3 style="display:none">Bottom Section</h3>
 
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting Commands OFP Elite |{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting Commands ArmA|{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
 
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
 
[[Category:Command Group: Program Flow|{{uc:{{PAGENAME}}}}]]
 
  
<!-- CONTINUE Notes -->
 
 
<dl class="command_description">
 
<dl class="command_description">
 +
 +
<dt></dt>
 
<dd class="notedate">Posted on October 21, 2014 - 23:33 (UTC)</dd>
 
<dd class="notedate">Posted on October 21, 2014 - 23:33 (UTC)</dd>
 
<dt class="note">[[User:DreadedEntity|DreadedEntity]]</dt>
 
<dt class="note">[[User:DreadedEntity|DreadedEntity]]</dt>
Line 83: Line 90:
 
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.
 
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>
 
<br><br>
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)
+
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>
 
</dd>
</dl>
 
<!-- DISCONTINUE Notes -->
 
  
<!-- CONTINUE Notes -->
+
<dt><dt>
<dl class="command_description">
 
 
<dd class="notedate">Posted on August 25, 2015 - 13:39 (UTC)</dd>
 
<dd class="notedate">Posted on August 25, 2015 - 13:39 (UTC)</dd>
 
<dt class="note">[[User:IT07|IT07]]</dt>
 
<dt class="note">[[User:IT07|IT07]]</dt>
Line 96: Line 100:
 
<code>_fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;</code>
 
<code>_fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;</code>
 
</dd>
 
</dd>
 +
 
</dl>
 
</dl>
<!-- DISCONTINUE Notes -->
 
 
 
 
An argument is '''always''' required to [[spawn]] a [[function]].<br>
 
However, your function get's executed the fastest if you use '''[[nil]]''' as argument e. g.<br>
 
<code>myFnc = {systemChat "Hello"};<br>nil spawn myFnc;</code><br>
 
 
Tested in Arma 3 1.62 [Tanoa Sneak Preview] with many [[Data_Types]] (and magic types) using [[BIS_fnc_codePerformance]].<br>
 
<br>
 
Using '''[] (Array)''',<br>
 
<code>['[] spawn myFnc',nil,1000] call BIS_fnc_codePerformance;</code>
 
//Results: 0.006 ms 0.005 ms 0.006 ms 0.005 ms 0.006 ms 0.006 ms 0.006 ms<br>
 
<br>
 
'''Type Number'''<br>
 
<code>['0 spawn myFnc',nil,1000] call BIS_fnc_codePerformance;</code>
 
//Results: 0.005 ms 0.004 ms 0.005 ms 0.006 ms 0.006 ms 0.005 ms 0.005 ms<br>
 
<br>
 
and using '''nil (Nothing)'''<br>
 
<code>['nil spawn myFnc',nil,1000] call BIS_fnc_codePerformance;</code>
 
//Results: 0.004 ms 0.003 ms 0.002 ms 0.002 ms 0.002 ms 0.002 ms 0.003 ms
 

Latest revision as of 19:09, 20 June 2021

Hover & click on the images for description

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.
When multiple Code is spawned in an order, there is no guarantee that the spawned Code will also execute in the same order. If you need such guarantee, use BIS_fnc_spawnOrdered function
Groups:
Program Flow

Syntax

Syntax:
arguments spawn code
Parameters:
arguments: Anything - 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
Example 3:
Local variables declared in the main scope are not available in the spawned code. You have to pass them as parameters: private _localVariable = 1234; [_localVariable] spawn { systemChat format ["_localVariable does not exist: %1", isNil "_localVariable"]; // _localVariable does not exist: true params ["_localVariable"]; systemChat format ["My _localVariable is now: %1", _localVariable]; // My _localVariable is now: 1234 };

Additional Information

See also:
callexecVMexecFSMexeccompilepreprocessFileLineNumberspreprocessFileterminatescriptDoneremoteExecsleepuiSleepcanSuspend

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
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.


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;