local context中的“receiveMessage”函数解析消息,并将函数的调用,路由到适当的消息处理函数,这样反序列化的JavaScript对象的“invoke”字段值是“load”,所以local context调用“optimizerLoad”函数,对default.html 页面的部分代码如下。
function receiveMessage(event) {
var data = JSON.parse(event.data)
if (data.invoke == "load") {
optimizerLoad();
} else if (data.invoke == "optimizeTrip") {
optimizerOptimizeTrip(data.locations, data.TravelMode, data.Optimize, data.BingMapsKey,
data.alpha, data.beta, data.rho, data.iterations, data.parallel);
} else if (data.invoke == "cancel") {
optimizerCancel();
} else if (data.invoke == "alert") {
// 显示信息对话框
new Windows.UI.Popups.MessageDialog(data.message).showAsync().then();
}
}
在迁移关键点方面,Bing Maps Trip Optimizer的ActiveX版本使用一个建立界面的代码文件,即“OptimizerControl.htm”,在使用WinRT迁移时,对于和web交互还有和WinRT交互的组件,需要编写分离的上下文,还需要写额外的代码使得上下文通信。
在Metro风格版本的应用中(包含mapControl.html的),可以使用原始版本(OptimizerControl.htm)中的大多数代码,一个主要不同是,由于Metro风格的应用不再引用ActiveX控件,我们将“object”元素用一个代表C++组件的全局变量替换了。
窗体方法比如alert,prompt,和open方法在JavaScript的Metro风格的应用中会失效,控件的ActiveX版本使用的是alert方法告知用户问题,比如何时输入的位置超过了25个。应用的Metro风格版本使用“Windows.UI.Popups.MessageDialog”类对用户显示信息,代码如下。
new Windows.UI.Popups.MessageDialog(data.message).showAsync().then();
由于在信息对话框显示之后,没有执行的操作,所以then语句是空的。
下面具体介绍使用C++执行密集计算操作,提升整体性能的方法。应用的C++部分被编写为WinRT dynamic-link library(DLL),其提供了如下的功能。
q 获取Bing Maps Web服务提供的每个位置的经纬度,这个操作使用Bing Maps的REST接口。
q 获取旅途中每对可能的点之间的距离,这个操作也使用Bing Maps的REST接口。
q 在寻找路线最优的操作中,使用蚁群优化算法和并行处理,来高效地计算优化路线。
这些操作是异步,或在后台执行的,这使得用户界面在优化过程中保持响应性。以下是一些C++组件使用的关键功能或技术。
使用“Concurrency::create_async”创建一个“Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>”对象,JavaScript应用程序使用这个对象监控过程进度及完成情况,并可以取消优化任务。组件使用“Concurrency::task”与Bing Maps通信,在后台执行优化任务。
q Bing Maps的REST服务用来获取位置和路由信息。
q IXMLHTTPRequest2执行异步请求,并从Bing Maps的REST服务中读取HTTP流。
q Windows::Data::Xml::Dom::XmlDocument读取Bing Maps的REST服务响应。
q Concurrency::parallel_for_each算法平行放置路由优化算法。
接下来在本节中,对内容进行分段介绍。
1)编码规范方面,除了使用WinRT创建Metro风格组件,C++组件使用时新的代码规约,比如在智能指针和异常处理的使用上。
WinRT是一个编程接口,可以用来创建仅在可信赖的操作系统环境中,运行的Metro风格的应用,这样的应用使用经授权的功能,数据类型和设备。WinRT是由抽象二进制接口(ABI)表示的,ABI属于下层二进制协议,使WinRT的API可以使用像VC++这样的编程语言。
为了方便使用WinRT编写应用,微软对VC++进行了语言扩展,使之能支持WinRT。许多这样的语言扩展像C++/CLI语言的语法。但是取代将公共语言运行时(CLR)作为目标的是,本机应用程序使用这样的语法以WinRT为目标,“^”修饰符是这种新语法的重要部分,因为它可以通过引用计数的方法,自动删除运行时对象。运行时在没有其他成分应用对象时会将其删除,这样取代了调用诸如“AddRef”和“Release”方法管理一个WinRT对象生命期。VC++创建Metro风格应用的另一个重要部分是“ref new”关键字,使用“ref new”而取代“new”来创建对引用计数的WinRT对象。
2)文件的组织方面,下面的列表说明了作为C++组件部分,每个源文件所起作用。
q AntSystem.h或AntSystem.cpp文件中定义了蚁群优化算法和所支持的数据结构。
q HttpRequest.h或HttpRequest.cpp文件定义“HttpRequest”类,其是执行异步HTTP请求的帮助类。
q pch.h或pch.cpp文件是项目的预编译头文件。
q TripOptimizer.h或TripOptimizer.cpp文件定义了“TripOptimizer”类,这个类是作为应用和核心构架逻辑间的接口。
q TripOptimizerImpl.h或TripOptimizerImpl.cpp文件中的“TripOptimizerImpl”类定义了构件的核心逻辑。