我们有几个地震属性发生器,需要来自输入体积中不的地震体积的数据。
在Petrel 2010中,只要生成器在UI线程中运行,这就可以正常工作。
Petrel 2011竭尽全力禁止这一点: 首先,生成器根本不再在主线程上运行。 其次,如果从属性工作线程访问,则在UI线程中获取的IAsyncSubCube会引发InvalidOperationException。这是异常消息:
[ArrayBufferAccessorLink]访问数组数据时出错:[RequestBroker] 当前线程(内部工作线程)没有 允许启动新数据访问。 (这种情况可能会发生 源自外部计算,例如异步。地震 属性计算。)异常类型:类 SLB ::鲑:: Adt的::例外:: InsufficientPermissionsException
有什么方法可以让这样的访问工作? (将这些卷作为常规属性输入提供不是一种选择。)
答案 0 :(得分:1)
我认为需要更多信息来回答你的问题。
您的属性是基于跟踪还是基于砖的?
您的属性在CanGenerateAsync中返回什么?
您使用什么样的API来访问地震卷? (代码示例会很棒)
最后,为什么您需要从属性生成器代码中访问未为您的属性输入的多维数据集?你能详细介绍一下你的用例吗?
答案 1 :(得分: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将允许您对“您的”线程执行一些操作。
警告:我没试过。
答案 2 :(得分: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];
}
}