Запрещен доступ к другим сейсмическим данным в генераторе атрибутов (2011) - PullRequest
2 голосов
/ 02 августа 2011

У нас есть несколько генераторов сейсмических атрибутов, которым требуются данные от сейсмических объемов, которые не среди входных объемов.

В Petrel 2010 это работало нормально, пока генератор работал в потоке пользовательского интерфейса.

Petrel 2011 идет на все, чтобы запретить это: Во-первых, генераторы больше не работают в основном потоке. Во-вторых, IAsyncSubCube, выбранный в потоке пользовательского интерфейса, создает исключение InvalidOperationException при обращении к нему из рабочего потока атрибута. Вот сообщение об исключении:

[ArrayBufferAccessorLink] Ошибка доступа к данным массива: [RequestBroker] Текущий поток, внутренний рабочий поток, не имеет разрешение инициировать новый доступ к данным. (Эта ситуация может быть исходя из внешних вычислений, например, асинхронный сейсмический вычисление атрибутов.) Тип исключения: класс Slb :: Лосось :: ADT :: Исключения :: InsufficientPermissionsException

Есть ли способ заставить такой доступ работать? (Предоставление этих томов в качестве регулярных атрибутных входов не вариант.)

Ответы [ 3 ]

1 голос
/ 06 августа 2011

Это может сработать:

Delegate dataGetCallback = new Func<Index3, Index3, float[,,]>(GetData);

void IGenerator.Calculate(ISubCube[] inputs, ISubCube[] outputs, Index3 min, Index3 max) {
    float[,,] data = (float[,,])CoreSystem.SynchronizedInvoke.Invoke(getDataCallback, new[] { min, max });

    MyAlgorithm(outputs, data, min, max);
}

float[,,] GetData(Index3 min, Index3 max) {
    return inputDataNotPassedAsArgument.GetSubCube(min, max).ToArray();
}

Рассмотрим вариант CoreSystem.SynchronizedInvoke.BeginInvoke вместо Invoke, который работает синхронно. BeginInvoke позволит вам поработать над «вашим» потоком, пока вы ждете, когда станут доступны данные.

Предупреждение: я не пробовал это.

1 голос
/ 10 августа 2011

Пожалуйста, используйте следующий подход, но убедитесь, что CanGenerateAsync всегда возвращает false:

    // GetAsyncSubCube in the calculation thread and use it in calculation thread
    public override void Calculate(Slb.Ocean.Petrel.DomainObject.Seismic.ISubCube[] input, Slb.Ocean.Petrel.DomainObject.Seismic.ISubCube output)
    {
        IAsyncSubCube cube = Parameters.Cube.GetAsyncSubCube(input[0].MinIJK, input[0].MaxIJK);

        foreach (Index3 index in output )
        {
            output[index] = cube[index];
        }
    }
1 голос
/ 03 августа 2011

Я думаю, что для ответа на ваш вопрос требуется больше информации.

Ваш атрибут на основе трассировки или на основе кирпича?

Что возвращает ваш атрибут в CanGenerateAsync?

Какие API вы используете для доступа к сейсмическим томам? (пример кода был бы отличным)

И, наконец, зачем вам нужен доступ к кубам, которые не вводятся для вашего атрибута, из кода генератора атрибутов? Не могли бы вы рассказать подробнее о вашем сценарии использования?

...