Когда i2 равно 0, восстанавливается предыдущий графический режим и экран очищается.
Когда i2 равно 1, подаётся звуковой сигнал, программа ждёт нажатия на клавишу перед восстановлением предыдущего графического режима.
Когда i2 равно 2, графический режим не восстанавливается и экран не очищается.
Комментарии:
Под DOS32 или WIN32 system_exec() запускает только .exe и .com программы. Для запуска пакетных файлов .bat или встроенных команд DOS следует пользоваться system() - некоторые команды DOS, такие как DEL и т.п., не являются отдельными программами, фактически они встроены в командный интерпретатор операционной системы.
Под DOS32 и WIN32 system_exec() не позволяет осуществлять перенаправление стандартных входа и выхода в командной строке st. Не разрешается также забирать в кавычки строки, которые содержат пробелы в именах каталогов и файлов.
Коды возврата из программ DOS или Windows обычно находятся в пределах от 0 до 255, 0 соответствует "нормальному завершению".
Вы можете запускать и дочерние программы Euphoria с использованием функции system_exec(). Программы Euphoria могут выдавать код возврата по команде abort().
system_exec() не запускает новую копию командного интерпретатора DOS.
Пример 1:
integer exit_code
exit_code = system_exec("xcopy temp1.dat temp2.dat", 2)
if exit_code = -1 then
puts(2, "n не могу запустить xcopy.exen")
elsif exit_code = 0 then
puts(2, "n успешное выполнение xcopyn")
else
printf(2, "n отказ xcopy с кодом ошибки %dn", exit_code)
end if
Пример 2:
-- исполняет myprog с двумя именами файлов в качестве аргументов
if system_exec("ex \test\myprog.ex indata outdata", 2) then
puts(2, "отказ!n")
end if
См. также:
system, abort
tan
Синтаксис:
x2 = tan(x1)
Описание:
Выдаёт тангенс x1, когда x1 выражен в радианах.
Комментарии:
Данная функция может быть применена к атому или ко всем элементам ряда.
Пример:
t = tan(1.0)
-- t равно 1.55741
См. также:
sin, cos, arctan
task_clock_start
Синтаксис:
task_clock_start()
Описание:
Перезапускает часы, используемые диспетчером для управления задачами реального времени. Эту подпрограмму необходимо вызвать, когда вы хотите возобновить выполнение задач реального времени, приостановленных командой task_clock_stop().
Комментарии:
Команды task_clock_stop() и task_clock_start() предназначены для приостановки и возобновления выполнения задач реального времени.
Вызов task_clock_start() корректирует плановое время всех задач реального времени на тот промежуток времени, который прошёл с момента вызова task_clock_stop(). Это позволяет игре, модели или другой программе продолжаться плавно за счёт того, что часы диспетчера задач оказываются развязанными от общесистемных часов.
Задачи общего времени при этом не затрагиваются.
Пример:
-- приостановить игру, пока игрок отвечает на телефонный звонок
task_clock_stop()
while get_key() = -1 do
end while
task_clock_start()
См. также:
task_clock_stop, task_schedule, task_yield, task_suspend
task_clock_stop
Синтаксис:
task_clock_stop()
Описание:
Останавливает часы диспетчера, ответственные за выполнение плана задач реального времени. Выполнение плана возобновится по команде task_clock_start(). Задачи общего времени могут продолжать выполняться. Текущая задача также может продолжать выполняться, но если это задача реального времени, управление от неё будет передано диспетчеру.
Комментарии:
Вызывайте task_clock_stop(), когда вам необходимо, чтобы диспетчер задач приостановил выполнение задач реального времени. Например, когда вы хотите временно остановить игру или программную модель, чтобы затем, после некоторого перерыва, продолжить её исполнение из точки остановки.
Функция time() этой командой не затрагивается, команда действует только в отношении часов диспетчера многозадачности Euphoria.
См. также:
task_clock_start, task_schedule, task_yield, task_suspend
task_create
Синтаксис:
a2 = task_create(i1, s)
Описание:
Оформляет заданную процедуру как новую задачу для передачи её диспетчеру многозадачности. Аргумент i1 представляет собой номер процедуры Euphoria, составляющей новую задачу. Ряд s - это список аргументов, которые будут поданы в процедуру-задачу, когда начнётся её исполнение. Выдаваемый результат, a2, является номером задачи, под которым она будет фигурировать в системе многозадачности Euphoria.
Комментарии:
Функция task_create() позволяет оформить новую задачу, но не запускает её на исполнение.
Каждая из задач имеет свой набор частных переменных и свой собственный стек вызова. Глобальные и местные переменные действуют для всех задач.
При обнаружении ошибки во время исполнения, отчёт будет включать информацию по всем задачам, с ошибочной задачей, идущей в списке первой.
Может быть создано несколько задач, все из которых основаны на одной и той же процедуре, возможно, с различными аргументами.
Задача не может иметь в основе функцию, так как нет возможности использования результата, выдаваемого функцией.
Каждая задача имеет уникальный номер. Функция task_create() никогда не выдаёт повторный номер задачи, как это было ранее. Номера задач являются атомами с величиной вплоть до наибольшей доступной целочисленной величины (15 цифр).
Пример:
mytask = task_create(routine_id("myproc"), {5, 9, "ABC"})
См. также:
task_schedule, task_yield, task_suspend, task_self
task_list
Синтаксис:
s = task_list()
Описание:
Выдаёт ряд, содержащий номера всех активных или приостановленных задач.
Комментарии:
Эта функция позволяет вам определить, какие задачи существуют в данный момент. Номера задач, которые были прекращены, в ряд не включаются. Вы можете уточнить состояние конкретной задачи, подав её номер в функцию task_status().
Пример:
sequence tasks
tasks = task_list()
for i = 1 to length(tasks) do
if task_status(tasks[i]) 0 then
printf(1, "задача %d активнаn", tasks[i])
end if
end for
См. также:
task_status, task_create, task_schedule, task_yield, task_suspend
task_schedule
Синтаксис:
task_schedule(a, x)
Описание:
Включает задачу номер a в план диспетчера, задаваемый аргументом x. Аргумент a должен быть получен как результат из функции task_create(). Если x является положительным атомом, это означает, что задача a является задачей общего времени и диспетчер должен x раз подряд обеспечить её выполнение, прежде чем перейти к другим задачам. Если x является рядом, это должен быть двухэлементный ряд {min, max}, в котором оба элемента больше нуля или равны нулю, а min и max дают минимальное и максимальное время, в секундах, которое необходимо выждать перед исполнением задачи реального времени a. Величины min и max также устанавливают временной интервал между последовательными запусками задачи a, если он не будет изменён повторным вызовом task_schedule() или task_suspend().
Комментарии:
Диспетчер задач, встроенный в систему исполнения программы Euphoria, будет использовать аргумент плана x как руководство к действию при работе с данной задачей. Может случиться так, что не всегда окажутся возможными заданное число последовательных запусков или заданные временные рамки задачи. Например, задача может решаться так долго перед отдачей управления диспетчеру, что другая задача не получит заданного временного окна.
Задачи реального времени имеют более высокий приоритет. Задачи общего времени выполняются, когда нет задач реального времени, готовых к выполнению. Задача может переключаться между режимами выполнения реального и общего времени. Это всё зависит от последнего вызова task_schedule() для данной задачи. Диспетчер никогда не запустит задачу реального времени до открытия её временного окна (величина min), и он пытается не допустить пропуска временного окна (величина max).
Чтобы повысить точность временных рамок, вы можете задать одну и ту же величину для min и для max. Тем не менее, задавая некоторый промежуток, вы добавляете диспетчеру гибкости. Это позволяет ему выполнять план задач более эффективно, избегая непродуктивных задержек. Когда диспетчеру требуется задержка, он вызывает sleep(), если задержка не слишком короткая. Использование sleep() позволяет операционной системе выполнять другие программы.
Величины min и max могут быть дробными. Если величина min меньше, чем разрешение часов диспетчера (в настоящее время 0.01 секунды под Windows и Linux/FreeBSD, и 0.55 секунды под DOS, если не вызывалась tick_rate()), точное диспетчирование не может быть выполнено, но диспетчер будет пытаться запустить задачу несколько раз подряд, чтобы приблизиться к заданному плану. Например, если вы задали время min равным 0.002 секунды, диспетчер будет пытаться запустить вашу задачу .01/.002 = 5 раз подряд, прежде чем ждать следующего тика часов через .01 секунды. Во время следующих 0.01 секунды он будет выполнять вашу задачу ещё (до) следующих 5 раз и так далее, считая, что ваша задача может быть завершена 5 раз за один тик его часов.