LockRead;
LockRead();
Метод LockRead осуществляет блокировку на чтение данных.
После окончания чтения данных для снятия блокировки выполните метод UnlockRead.
Для выполнения примера предполагается наличие в репозитории куба с идентификатором «STD_CUBE». Для куба включена возможность кэширования данных.
Sub UserProc;
Var
MB: IMetabase;
CubeInst: ICubeInstance;
CubeDest: ICubeInstanceDestination;
Executor: ICubeInstanceDestinationExecutor;
Sels: IDimSelectionSet;
Sel: IDimSelection;
ResultMatrix: IMatrix;
Iter: IMatrixIterator;
IterMutex: IRWMutex;
Begin
MB := MetabaseClass.Active;
//Открываем куб
CubeInst := MB.ItemById("STD_CUBE").Open(Null) As ICubeInstance;
CubeDest := CubeInst.Destinations.DefaultDestination;
Executor := CubeDest.CreateExecutor;
//Отметка, в соответствии с которой будет формироваться матрица данных
Sels := CubeDest.CreateDimSelectionSet;
For Each Sel In Sels Do
Sel.SelectAll;
End For;
Executor.PrepareExecute(Sels);
//Получение матрицы из кэша
Executor.PerformExecuteO(CubeInstanceDestinationExecutorOptions.Cached);
ResultMatrix := Executor.Matrix;
Iter := ResultMatrix.CreateIterator;
//Если данные получены из кэша, то итератор поддерживает IRWMutex
//и необходима блокировка перед выполнением действий
If Iter Is IRWMutex Then
IterMutex := Iter As IRWMutex;
//Блокировка данных на чтение
IterMutex.LockRead;
End If;
Iter.Move(IteratorDirection.First);
While Iter.Valid Do
//...
//Работа с итератором для чтения данных
//...
Iter.Move(IteratorDirection.Next);
End While;
//Снятие блокировки
If IterMutex <> Null Then
If IterMutex.HasReadLock Then
IterMutex.UnlockRead;
End If;
End If;
End Sub UserProc;
При выполнении примера из кэша куба будет получена матрица с данными. Для работы с матрицей осуществляется блокировка кэша на чтение.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Public Shared Sub Main1(Params: StartParams);
Var
MB: IMetabase;
CubeInst: ICubeInstance;
CubeDest: ICubeInstanceDestination;
Executor: ICubeInstanceDestinationExecutor;
Sels: IDimSelectionSet;
Sel: IDimSelection;
ResultMatrix: IMatrix;
Iter: IMatrixIterator;
IterMutex: IRWMutex;
Begin
MB := Params.Metabase;
//Открываем куб
CubeInst := MB.ItemById["STD_CUBE"].Open(Null) As ICubeInstance;
CubeDest := CubeInst.Destinations.DefaultDestination;
Executor := CubeDest.CreateExecutor();
//Отметка, в соответствии с которой будет формироваться матрица данных
Sels := CubeDest.CreateDimSelectionSet();
For Each Sel In Sels Do
Sel.SelectAll();
End For;
Executor.PrepareExecute(Sels);
//Получение матрицы из кэша
Executor.PerformExecuteO(CubeInstanceDestinationExecutorOptions.cideoCached As Integer);
ResultMatrix := Executor.Matrix;
Iter := ResultMatrix.CreateIterator();
//Если данные получены из кэша, то итератор поддерживает IRWMutex
//и необходимо блокировка перед выполнением действий
If Iter Is IRWMutex Then
IterMutex := Iter As IRWMutex;
//Блокировка данных на чтение
IterMutex.LockRead();
End If;
Iter.Move(IteratorDirection.itdFirst);
While Iter.Valid Do
//...
//Работа с итератором для чтения данных
//...
Iter.Move(IteratorDirection.itdNext);
End While;
//Снятие блокировки
If IterMutex <> Null Then
If IterMutex.HasReadLock Then
IterMutex.UnlockRead();
End If;
End If;
End Sub;
См. также: