Перейти к основному содержимому
Версия: 4.x

Создание потоков (NEWTHREAD, NEWEXECUTOR)

Оператор создания нового потока позволяет выполнить действие в другом, отличным от текущего, потоке.

По умолчанию, в новом потоке действие выполняется один раз, сразу же после создания этого потока. Однако, при необходимости, действие можно выполнить с заданной задержкой и/или выполнять постоянно через определенный интервал времени.

Также действие можно выполнить в новом потоке от имени заданного подключения (например некоторого пользователя). В этом случае внутри действии могут присутствовать операторы взаимодействия с пользователем, в том числе открытие формы в интерактивном представлении (по умолчанию при использовании этих операторов платформа выдаст ошибку).

Задержка, интервал и подключение в этом операторе задаются как некоторые свойства.

Создание пула потоков

Иногда количество одновременно выполняющихся потоков необходимо ограничить некоторым значением (как правило это делается если выполняемые действия не критичны и момент времени когда они завершатся не так важен). Для реализации такой функциональности в платформе существует оператор создания нового пула потоков. Этот оператор позволяет выполнить действие таким образом, что все создаваемые внутри этого действия новые потоки будут попадать в созданный этим оператором пул потоков, в котором при этом одновременно сможет выполняться не более чем заданное количество потоков.

Количество потоков задается как некоторое свойство.

Язык

Для объявления действия, выполняющего другое действие в новом потоке, используется оператор NEWTHREAD. Для выполнения действия в новом пуле потоков используется оператор NEWEXECUTOR.

Примеры

testNewThread ()  {
//Показ всем сообщения 'Сообщение'
FOR user(Connection conn) AND connectionStatus(conn) == ConnectionStatus.connectedConnection AND conn != currentConnection() DO {
NEWTHREAD MESSAGE 'Сообщение'; CONNECTION conn;
}

//Выполнение действия action с периодичностью в 10 секунд и задержкой 5 секунд
NEWTHREAD MESSAGE 'Hello World'; SCHEDULE PERIOD 10000 DELAY 5000;
}
testExecutor  {
NEWEXECUTOR {
FOR id(Sku s) DO {
NEWTHREAD {
NEWSESSION {
name(s) <- STRING[20](id(s)); // записываем в наименование код в 10 потоков
APPLY;
}
}
}
} THREADS 10;
}