---
name: "while"
type: command
status: ok
groups: ["Program Flow"]
arma3_since: "0.50"
locality: {"argument": null, "effect": null, "server_exec": false}
source: https://community.bistudio.com/wiki/while
revid: 369060
updated: 2024-09-02T20:24:55Z
---

# while

*Command · Program Flow · Arma 3 v0.50 · introduced in Operation Flashpoint v1.85*

## Description

Repeats [Code](../topics/Code.md) while the given condition is [true](../commands/true.md). A part of [while](../commands/while.md)-[do](../commands/do.md) construct.

> [!IMPORTANT]
> - A [while](../commands/while.md) loop does not have any suspension, meaning that if used in [scheduled environment](../topics/Scheduler.md#scheduled_environment) without any suspension ([sleep](../commands/sleep.md) or [uiSleep](../commands/uiSleep.md)) the code will run multiple times per frame and consumes the 3 ms per frame scheduler execution limit. This should be avoided if not intended (see [#Example 3](../commands/while.md#example-3)).
> - In [non-scheduled environment](../topics/Scheduler.md#unscheduled_environment), [while](../commands/while.md) [do](../commands/do.md) loop is limited to 10,000 iterations, after which it exits even if condition is still [true](../commands/true.md).

## Syntax

```sqf
while condition
```

**Parameters:**

- `condition`: [Code](../topics/Code.md)

**Returns:** [While Type](../topics/While_Type.md)

## Examples

### Example 1

```sqf
while { a < b } do { a = a + 1 };
```

### Example 2

A practical example: Repair all members of a group to such a level that they are able to stand up:

```sqf
{
    if (alive _x) then
    {
        while { not canStand _x } do
        {
            _x setDamage (damage _x - 0.01);
        };
    };
} forEach units group unitname;
```

### Example 3

```sqf
0 spawn {
    // warning: while loop without suspension executes multiple times per frame
    private _counter = 0;
    private _endTime = diag_tickTime + 5;
    private _frameNo = diag_frameNo;
    while { diag_tickTime < _endTime } do
    {
        _counter = _counter + 1;
    };
    // in an empty mission, the _counter may go well over 2000 times per frame!
    hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)];

    // with suspension
    private _counter = 0;
    private _endTime = diag_tickTime + 5;
    private _frameNo = diag_frameNo;
    while { diag_tickTime < _endTime } do
    {
        _counter = _counter + 1;
        uiSleep 0.001; // waits at least 1 frame
    };
    // _counter says one per frame, as expected
    hint format ["Average Execution: %1 times per frame", _counter / (diag_frameNo - _frameNo)];
};
```

## See also

[Control Structures](../topics/Control_Structures.md) · [waitUntil](../commands/waitUntil.md) · [for](../commands/for.md) · [do](../commands/do.md)

## Community notes

**Kronzky** — 2008-05-14

The boolean code that is used to evaluate the while condition can be preceded by code that executes a regular command.

```sqf
while { _a =_a + 1; _a < 10 } do { /* ... */ };
```

<sub>Source: [BI Community Wiki — while](https://community.bistudio.com/wiki/while) (revision 369060).</sub>
