STK组件:计算上下文

翻译,原文地址:http://help.agi.com/AGIComponents/html/CalculationContext.htm

STK组件中的许多计算需要各种上下文信息。定义了什么闰秒?如何建模地球的定向,以便在地固系和惯性系之间进行转换?这种上下文信息可以在任何需要它的地方传递,但这会很麻烦。计算上下文是存储和查找此类信息的一致位置,因此不需要将其作为参数传递给方法。

计算上下文和Facets

计算上下文在某些方面与全局变量或静态类类似。像全局变量或静态类一样,它可以从任何地方方便地访问。然而,计算上下文要灵活得多。每个线程都可以有自己的计算上下文,而不是为整个应用程序提供全局变量或静态类的单个副本。这允许不同的线程以不同的方式建模地固系和惯性系之间的转换,同时仍然允许需要进行转换的代码使用正确的转换,而不传递任何其他内容。

因此,计算上下文对于上下文信息非常有用,这些信息通常在整个应用程序中是一致的,但有时需要在不同的执行线程中有所不同。例如,一个多用户Web应用程序处理两个不同用户的请求时,可能会根据用户的偏好,为一个用户使用一个地球模型,为另一个用户使用另一个地球模型。

一般来说,您不会直接与CalculationContext类型进行交互,而是使用CalculationContextFacets,其中每一个都表示驻留在CalculationContext中的一块上下文信息。Facets通常有一个静态的GetFromContext方法来从当前的CalculationContext中检索当前有效的实例。例如,要检索CentralBodiesFacet实例,请使用其GetFromContext方法:

CentralBodiesFacet centralBodies = CentralBodiesFacet.GetFromContext();

如果上下文中不存在CentralBodiesFacet实例,则将创建并返回一个新实例。
类似地,您可以向CalculationContext添加实例,如下代码所示,该代码使用CentralBodiesFacet.UseIncurrentContext()方法:

CentralBodiesFacet centralBodies = new CentralBodiesFacet();
// 按需配置centralBodies
centralBodies.UseInCurrentContext();

以下Facets随STK组件提供:

  • CentralBodiesFacet
  • LeapSecondsFacet

计算上下文和多线程

如前所述,每个线程都有自己的计算上下文。这就提出了一个问题:新线程如何获取计算上下文?他们从哪里得到的?

第一次创建线程时,它没有计算上下文。第一次尝试通过访问实例属性或调用方面的GetFromContext方法访问计算上下文时,将为线程创建默认的CalculationContext实例。

通过设置DefaultForNewContexts属性,可以更改为新线程创建的默认上下文。例如,下面的代码使当前上下文成为新线程使用的默认上下文。

CalculationContext.DefaultForNewContexts = CalculationContext.Instance;

每当STK组件本身创建新的线程(例如并行化过境计算)时,它总是将启动计算的计算上下文复制到实际执行计算的线程中。通过使用BackgroundCalculation类型,您可以非常容易地为自己的线程执行相同的操作。BackgroundCalculation.NET BackgroundWorker类非常相似,只是它会自动将计算上下文复制到Worker线程中。BackgroundCalculationBackgroundWorker还有其他一些不同之处。有关更多信息,请参阅参考文档。
如果不使用BackgroundCalculation,则仍可以手动复制计算上下文。在启动新线程之前,请复制当前计算上下文:

CalculationContext contextForThread = CopyForAnotherThread.Copy(CalculationContext.Instance);

然后,将新实例传递给线程:

Thread thread = new Thread(ThreadEntryPoint);
thread.Start(contextForThread);

最后,在线程入口点函数的顶部,将当前计算上下文设置为从主线程传递的上下文:

public static void ThreadEntryPoint(object parameter)
{
    CalculationContext calculationContext = (CalculationContext)parameter;
    CalculationContext.Instance = calculationContext;

    // 线程从这开始实际工作
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容