execVM: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(add. scriptDone references)
m (Text replacement - "|SYNTAX= |p21=" to "|SYNTAX2= |p21=")
(43 intermediate revisions by 14 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=
____________________________________________________________________________________________
____________________________________________________________________________________________


| Compile and execute [[SQF_syntax|SQF]] [[Script]].
| Compiles and adds [[SQF_syntax|SQF]] [[Script]] to the [[Scheduler|scheduler]] queue and returns script handle. The script is first searched for in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. The script does not execute immediately upon running [[execVM]] command, but with some delay. How much delay is unknown as it largely depends on how many other scripts there are in the queue and how busy is VM. The optional argument is passed to the script in [[private]] variable <tt>_this</tt>. In Arma 3 the script handle is also passed to the script in <tt>_thisScript</tt> variable.
<br><br>In order to understand [[execVM]] consider the following comparison:
<code>[[private]] _handle <nowiki>=</nowiki> _args [[execVM]] "someFile.sqf";
// is practically identical to
[[private]] _handle <nowiki>=</nowiki> _args [[spawn]] [[compile]] [[preprocessFileLineNumbers]] "someFile.sqf";</code>
So if you need multiple execution of the same file, you might want to store it in a function ([[Functions_Library_(Arma_3)|Functions Library]]), otherwise, for a single execution, [[execVM]] is a good choice.<br><br>


The '''optional''' argument is passed to the script as local variable _this.
To see what VM scripts are currently in the scheduler, use [[diag_activeSQFScripts]] command.<br><br>
{{Warning | If the file you are executing is not prepared using UTF-8 encoding and contains some characters [[toArray | with codes]] > 127, they might convert incorrectly}}
|DESCRIPTION=
____________________________________________________________________________________________


Script is compiled every time you use this command.
| arguments '''execVM''' filename |SYNTAX=


The [[Script]] is first searched for in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. |= Description
|p1= arguments: [[Anything]] -  Arguments accessible as <tt>_this</tt> in the script |PARAMETER1=
____________________________________________________________________________________________
 
|p2= filename: [[String]] - file with sqf code (doesn't have to have .sqf extension, but not using standard extensions may cause problems later, during binarisation)|PARAMETER2=


| [[Script]] <nowiki>=</nowiki> argument '''execVM''' filename |= Syntax
| [[Script]] - script handle, can be used to determine (via [[scriptDone]] (also via [[isNull]] in Arma 3)) when the execVMed script has finished. In Arma 3, the handle is also available inside the execVMed script in <tt>_thisScript</tt> variable.|RETURNVALUE=


|p1= argument: [[Any Value]](s) |= Parameter 1
|s2= '''execVM''' filename |SYNTAX2=


|p2= filename: [[String]] |= Parameter 2
|p21= filename: [[String]] - file with sqf code (doesn't have to have .sqf extension, but not using standard extensions may cause problems later, during binarisation) |PARAMETER2=


| [[Script]] - script handle, which can be used to determine (via [[scriptDone]]) when the called script has finished.|= Return value
| r2= [[Script]] - script handle, can be used to determine (via [[scriptDone]] (also via [[isNull]] in Arma 3)) when the execVMed script has finished. In Arma 3, the handle is also available inside the execVMed script in <tt>_thisScript</tt> variable.|RETURNVALUE=
____________________________________________________________________________________________
____________________________________________________________________________________________
   
   
|x1= <code>_Handle <nowiki>=</nowiki> [[player]] execVM "test.sqf"; @ScriptDone _Handle</code> |= Example 1
|x1= <code>_handle = [[execVM]] "test.sqf";</code> |EXAMPLE1=
 
|x2= <code>_handle = [[player]] [[execVM]] "test.sqf";  
[[waitUntil]] {[[scriptDone]] _handle};</code> |EXAMPLE2=
 
|x3= In Arma 3 this is also possible: <code>_handle = [[execVM]] "123.sqf";
[[waitUntil]] {[[isNull]] _handle};</code> |EXAMPLE2=
 
 
|x4= <code>[4] execVM "showDamage.sqf";
// showDamage.sqf
_damage = _this [[select]] 0;
[[hint]] [[format]] ["%1", _damage];</code> |EXAMPLE4=
____________________________________________________________________________________________
____________________________________________________________________________________________


| [[exec]], [[scriptDone]], [[SQF syntax]], [[Control Structures]] |= See also
| [[call]], [[spawn]], [[exec]], [[execFSM]], [[scriptDone]], [[scriptNull]], [[terminate]], [[sleep]], [[uiSleep]], [[waitUntil]], [[canSuspend]], [[diag_activeScripts]], [[diag_activeSQFScripts]], [[SQF syntax]], [[Control Structures]] |SEEALSO=


}}
}}
<h3 style="display:none">Notes</h3>
<dl class="command_description">
</dl>


<h3 style="display:none">Notes</h3>
<h3 style="display:none">Notes</h3>
<dl class="command_description">
<dl class="command_description">
<!-- Note Section BEGIN -->
<!-- Note Section BEGIN -->
<dd class="notedate">Posted on January 5, 2007 - 12:30</dd>
<dt class="note">'''[[User:Giova|Giova]]'''</dt><dd class="note">More about the Returned value:''


the type 'Script' returned by this command, is in fact a kind of 'Thread Handle'.
<dd class="notedate">Posted on November 23, 2010 - 15:56
<dt class="note">'''[[User:Kabilen|Kabilen]]'''<dd class="note">Passing variables to the script file''


To pass multiple variables to the script file, use an array e.g:


GOOD POINT:
'''null = [myunit,1234] execVM "test.sqf";'''


sqf functions launched with execVM will run asynchronously from its caller script/function.
Now within test.sqf to access the elements, use the following:


It is possible to manage multi-threading development, by using:
'''_myunit = _this select 0;'''<br>
'''_myvar = _this select 1;'''


-handle script returned by execVM


-force the thread to terminate by using 'terminate' command


-synchronise a script by using 'ScriptDone' command


<!-- Note Section END -->
</dl>


BAD POINT:
<h3 style="display:none">Notes</h3>
 
<dl class="command_description">
-sqf funcion cannot return value (because execVM is already returning the thread Handle)
<!-- Note Section BEGIN -->
 
-the variable _time does not work in sqf called with execVM command
</dd>


<!-- Note Section END -->
<!-- Note Section END -->
Line 69: Line 91:
[[Category:Scripting Commands ArmA|EXECVM]]
[[Category:Scripting Commands ArmA|EXECVM]]
[[Category:Command Group: Program Flow|EXECVM]]
[[Category:Command Group: Program Flow|EXECVM]]
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]

Revision as of 02:53, 3 September 2019

-wrong parameter ("Arma") defined!-1.00
Hover & click on the images for description

Description

Description:
Compiles and adds SQF Script to the scheduler queue and returns script handle. The script is first searched for in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. The script does not execute immediately upon running execVM command, but with some delay. How much delay is unknown as it largely depends on how many other scripts there are in the queue and how busy is VM. The optional argument is passed to the script in private variable _this. In Arma 3 the script handle is also passed to the script in _thisScript variable.

In order to understand execVM consider the following comparison: private _handle = _args execVM "someFile.sqf"; // is practically identical to private _handle = _args spawn compile preprocessFileLineNumbers "someFile.sqf"; So if you need multiple execution of the same file, you might want to store it in a function (Functions Library), otherwise, for a single execution, execVM is a good choice.

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

If the file you are executing is not prepared using UTF-8 encoding and contains some characters with codes > 127, they might convert incorrectly
Groups:
Uncategorised

Syntax

Syntax:
arguments execVM filename
Parameters:
arguments: Anything - Arguments accessible as _this in the script
filename: String - file with sqf code (doesn't have to have .sqf extension, but not using standard extensions may cause problems later, during binarisation)
Return Value:
Script - script handle, can be used to determine (via scriptDone (also via isNull in Arma 3)) when the execVMed script has finished. In Arma 3, the handle is also available inside the execVMed script in _thisScript variable.

Alternative Syntax

Syntax:
execVM filename
Parameters:
filename: String - file with sqf code (doesn't have to have .sqf extension, but not using standard extensions may cause problems later, during binarisation)
Return Value:
Script - script handle, can be used to determine (via scriptDone (also via isNull in Arma 3)) when the execVMed script has finished. In Arma 3, the handle is also available inside the execVMed script in _thisScript variable.

Examples

Example 1:
_handle = execVM "test.sqf";
Example 2:
_handle = player execVM "test.sqf"; waitUntil {scriptDone _handle};
Example 3:
In Arma 3 this is also possible: _handle = execVM "123.sqf"; waitUntil {isNull _handle};
Example 4:
[4] execVM "showDamage.sqf"; // showDamage.sqf _damage = _this select 0; hint format ["%1", _damage];

Additional Information

See also:
callspawnexecexecFSMscriptDonescriptNullterminatesleepuiSleepwaitUntilcanSuspenddiag_activeScriptsdiag_activeSQFScriptsSQF syntaxControl Structures

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

Notes

Notes

Posted on November 23, 2010 - 15:56
Kabilen
Passing variables to the script file To pass multiple variables to the script file, use an array e.g: null = [myunit,1234] execVM "test.sqf"; Now within test.sqf to access the elements, use the following: _myunit = _this select 0;
_myvar = _this select 1;

Notes

Bottom Section