2

我们有几个地震属性生成器,它们需要来自输入体之外的地震体数据。

在 Petrel 2010 中,只要生成器在 UI 线程中运行,它就可以正常工作。

Petrel 2011 竭尽全力禁止这样做:首先,生成器根本不再在主线程上运行。其次,如果从属性工作线程访问,在 UI 线程中获取的 IAsyncSubCube 会引发 InvalidOperationException。这是异常消息:

[ArrayBufferAccessorLink] 访问数组数据时出错:[RequestBroker] 当前线程,内部工作线程,无权发起新的数据访问。(这种情况可能源于外部计算,例如异步地震属性计算。) 异常类型:类 Slb::Salmon::Adt::Exceptions::InsufficientPermissionsException

有什么办法可以使这样的访问工作?(提供这些卷作为常规属性输入不是一种选择。)

4

3 回答 3

1

我认为需要更多信息来回答您的问题。

您的属性是基于跟踪还是基于砖块?

你的属性在 CanGenerateAsync 中返回什么?

您使用什么样的 API 来访问地震卷?(代码示例会很棒)

最后,为什么您需要从属性生成器代码访问不是您的属性输入的多维数据集?您能否详细介绍一下您的用例?

于 2011-08-03T13:07:11.223 回答
1

这可能有效:

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 将让您在等待数据可用时在“您的”线程上做一些工作。

警告:我没有试过这个。

于 2011-08-05T21:05:45.683 回答
1

请使用以下方法,但请确保 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];
        }
    }
于 2011-08-10T12:04:32.347 回答