CalculateAsync([Callback: ICalcEtlCallback = Null;] [Objs: ICalcObjectsList = Null]): IAlgorithmCalculationAsyncResult;
Отсутствует;
Callback. Объект, реализующий обратную связь;
Objs. Список объектов алгоритма расчёта.
Примечание. Список объектов алгоритма расчёта должен быть скопированным. Для копирования объектов используйте метод ICalcObjectsList.Clone.
Метод CalculateAsync выполняет асинхронный расчёт алгоритма.
В процессе выполнения асинхронного расчёта алгоритма должен использоваться режим ожидания для выявления ошибок, возникших при расчёте, и проверки завершения расчёта.
Режим ожидания реализован функцией GetState:
Function GetState(CalcResult: IAlgorithmCalculationAsyncResult): CalculateState;
Var
State: CalculateState;
i: Integer = 1000;
Begin
// Проверим состояние расчёта
If CalcResult <> Null Then
State := CalcResult.State;
While
(State <> CalculateState.PausedOnDebug) And
(State <> CalculateState.PausedOnError) And
(State <> CalculateState.Aborted) And
(State <> CalculateState.Stoped) Do
State := CalcResult.State;
End While;
End If;
While i > 0 Do
i := i - 1;
End While;
Return State;
End Function GetState;
Для выполнения примера предполагается наличие в репозитории алгоритма расчёта с идентификатором ALGORITHM, в котором содержатся хотя бы два объекта для расчёта.
Добавьте ссылки на системные сборки: Algo, Metabase. Также добавьте ссылки на сборки, которые необходимы для работы с алгоритмами расчёта.
Sub UserProc;
Var
MB: IMetabase;
MObj: IMetabaseObjectDescriptor;
Algo: ICalcObject;
ObjList, CloneList: ICalcObjectsList;
CalcAlgo: ICalcAlgorithm;
CalcResult: IAlgorithmCalculationAsyncResult;
ErrEvent: IAlgorithmCalculateErrorEvent;
i: Integer;
Begin
MB := MetabaseClass.Active;
// Получим алгоритм расчёта
MObj := MB.ItemById("ALGORITHM");
Algo := CalcObjectFactory.CreateCalcObject(MObj, True);
CalcAlgo := Algo As ICalcAlgorithm;
// Получим список объектов алгоритма расчёта
ObjList := CalcAlgo.Items;
// Скопируем список объектов алгоритма расчёта
CloneList := ObjList.Clone;
// Удалим исключенные объекты перед расчётом
For i := CloneList.Count - 1 To 0 Step - 1 Do
If Not CalcAlgo.Included(CloneList.Item(i)) Then
CloneList.Remove(CloneList.Item(i));
End If;
End For;
// Выведем в консоль количество включенных объектов в расчёт алгоритма
Debug.WriteLine("Количество объектов: " + CloneList.Count.ToString);
// Выполним асинхронный расчёт алгоритма
CalcResult := CalcAlgo.CalculateAsync(Null, CloneList);
// Проверим возникновение ошибки при расчёте
If GetState(CalcResult) = CalculateState.PausedOnError Then
ErrEvent := CalcResult.ErrorEvent;
If ErrEvent <> Null Then
// При возникновении ошибки выведем в консоль информацию о ней
Debug.WriteLine(ErrEvent.Message);
// Пропустим возникшую ошибку и продолжим расчёт
ErrEvent.ErrorState := SkipErrorState.IgnoreAll;
End If;
End If;
// Проверим завершение расчёта алгоритма
If GetState(CalcResult) = CalculateState.Stoped Then
// Выведем в консоль сообщение о завершении расчёта алгоритма
Debug.WriteLine("Расчёт алгоритма завершен");
End If;
End Sub UserProc;
Function GetState(CalcResult: IAlgorithmCalculationAsyncResult): CalculateState;
Var
State: CalculateState;
i: Integer = 1000;
Begin
// Проверим состояние расчёта
If CalcResult <> Null Then
State := CalcResult.State;
While
(State <> CalculateState.PausedOnDebug) And
(State <> CalculateState.PausedOnError) And
(State <> CalculateState.Aborted) And
(State <> CalculateState.Stoped) Do
State := CalcResult.State;
End While;
End If;
While i > 0 Do
i := i - 1;
End While;
Return State;
End Function GetState;
Не предусмотрен.
В результате выполнения примера будет произведен асинхронный расчёт алгоритма. В консоль будет выведено количество рассчитанных объектов и сообщение о завершении расчёта, например:
Количество объектов: 3
Расчёт алгоритма завершен
См. также: