3)创建TripOptimizer和TripOptimizerImpl类。C++组件包含一个WinRT类“TripOptimizerComponent::TripOptimizer”,这个类衔接其他WinRT组件,“TripOptimizer”类只定义了与其他WinRT组件通信的方法,而具体实现细节由TripOptimizerImpl类来处理,选择这个模式是来更好的封装公共接口,并将其从具体实现细节中分离,代码如下。

//定义TripOptimizer类.这个类衔接应用和具体实现细节

public ref class TripOptimizer sealed

{

public:

TripOptimizer();

~TripOptimizer();

//作为一个异步过程优化出行

Windows::Foundation::IAsyncOperationWithProgress<

Windows::Foundation::Collections::IMap<

Platform::String^,

Windows::Foundation::Collections::IVector<Platform::String^>^>^,

Platform::String^>^ OptimizeTripAsync(

Windows::Foundation::Collections::IVector<Platform::String^>^ waypoints,

Platform::String^ travelMode,

Platform::String^ optimize,

Platform::String^ bingMapsKey,

double alpha, double beta, double rho,

unsigned long iterations, bool parallel);

private:

// 定义优化程序的具体实现细节

std::unique_ptr<Details::TripOptimizerImpl> m_impl;

};

TripOptimizer::OptimizeTripAsync方法是应用和C++组件通信的方式,TripOptimizer::OptimizeTripAsync方法启动计算优化出行路线的任务序列,而从这个方法传回的值,用于监视进行优化的任务的进度和完成情况,其同样可以用来取消操作。ripOptimizer::OptimizeTripAsync方法是依据TripOptimizerImpl类来执行操作的,有关代码如下。

// 将优化出行路线作为一个异步的过程

IAsyncOperationWithProgress<IMap<String^, IVector<String^>^>^, String^>^

TripOptimizer::OptimizeTripAsync(

IVector<String^>^ waypoints,

String^ travelMode,

String^ optimize,

String^ bingMapsKey,

double alpha, double beta, double rho,

unsigned long iterations, bool parallel)

{

return m_impl->OptimizeTripAsync(waypoints,travelMode, optimize, bingMapsKey,

alpha, beta, rho, iterations, parallel);

}

4)组件的工作流程。TripOptimizer::OptimizeTripAsync方法,启动一系列操作来计算优化路径,这个方法进行异步执行,使应用能够保持响应,此方法返回Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>接口,而一个调用此方法的WinRT组件,可以使用这个对象得到返回值,如果有的话。这个接口也使得调用函数可以监视运行进度,接收出现的任何错误。

每个WinRT使用的语言(C++,JavaScript等等)都有自身创建异步操作的方式。在C++中,可以利用Concurrency::create_async函数,这个函数返回一个IAsyncAction,IAsyncActionWithProgress<TProgress>,IAsyncOperation<TResult>或是IAsyncOperationWithProgress<TResult, TProgress>对象,其返回类型取决于传给它的函数对象的签名。比如,由于TripOptimizerImpl::OptimizeTripAsync方法将一个Concurrency::progress_reporter对象作为其参数并返回一个非空值,create_async返回IAsyncOperationWithProgress<TResult, TProgress>接口;如果这个方法返回为空,create_async将会返回IAsyncActionWithProgress<TProgress>接口,下面的代码演示了TripOptimizerImpl::OptimizeTripAsync方法。

//异步操作优化出行路径

IAsyncOperationWithProgress<IMap<String^, IVector<String^>^>^, String^>^

TripOptimizerImpl::OptimizeTripAsync(

IVector<String^>^ waypoints,

String^ travelMode,

String^ optimize,

String^ bingMapsKey,

double alpha, double beta, double rho,

unsigned long iterations, bool parallel)

{

// 将输入拷贝到一个OptimizeTripParams结构体

auto params = make_shared<OptimizeTripParams>();

for_each(begin(waypoints), end(waypoints), [params](String^ waypoint) {

params->Waypoints.push_back(waypoint->Data());

});

params->TravelMode = wstring(travelMode->Data());

params->Optimize = wstring(optimize->Data());

params->BingMapsKey = UriEncode(bingMapsKey->Data());

params->Alpha = alpha;

params->Beta = beta;

params->Rho = rho;

params->Iterations = iterations;

params->Parallel = parallel;

// 执行异步操作

return create_async([this, params](

progress_reporter<String^> reporter, cancellation_token cancellationToken)

{

// 为取消创建一个链接的资源

// 这样使得调用函数(通过返回的IAsyncOperationWithProgress对象)和这个类来设置同样的取消标记。

m_cancellationTokenSource =

cancellation_token_source::create_linked_source(cancellationToken);

// 执行优化操作

return OptimizeTrip(params, cancellationToken, reporter)

.then([this](task<IMap<String^, IVector<String^>^>^> previousTask) -> IMap<String^, IVector<String^>^>^

{

try {

return previousTask.get();

}

catch (task_canceled&) {

return nullptr;

}

}, cancellationToken);

});

}

progress_reporter对象与调用函数进行进度信息的通信,cancellation_token对象使组件响应撤销请求(下面的内容会讲到对撤销的处理)。

提供给TripOptimizer::OptimizeTripAsync中的create_async的功能函数返回一个“task”对象,而返回的可以是一个值,T类型,一个任务,或是create_async中的task<T>。返回task<T>可以使我们不用只得等待后台任务的运行结果,而是使运行时在运行结果出来的时候,获取结果并将其传递给调用函数。

TripOptimizer.cpp文件定义了task_from_result辅助函数,此函数返回一个连同所提供结果的“task”对象,在写一个返回“task”的函数时,使用这个函数会很有帮助,相关代码如下。

// 连同所提供结果创建一个任务

template <typename Result>

task<Result> task_from_result(Result result)

{

return task<Result>([result]() -> Result { return result; });

}

下图说明了当一个外部组件调用TripOptimizer::OptimizeTripAsync,启动优化操作时,引发的操作流程。

开发 Windows 8 Bing地图应用(4)相关推荐

  1. 开发 Windows 8 Bing地图应用(2)

    下面是对使用JavaScript的Bing Maps Trip Optimizer示例的介绍,讲述应用的JavaScript部分组织形式,本地的上下文和网络上下文之间的通信. WinRT需要访问网络的 ...

  2. Windows Mobile引路蜂地图开发方案介绍

    1.引路蜂对不同开发者开发平台的支持 引路蜂平台开发支持:Java ME.LWUIT.Blackberry .Android.iOS.Windows Phone.桌面平台(Java SE, .Net ...

  3. Bing地图REST服务

    Bing Maps REST Services Bing地图REST服务 The Bing™ Maps REST Services Application Programming Interface ...

  4. SharePoint2010整合Silverlight 4应用——Bing地图控件

    本文中我们将展示如何在SharePoint 2010中集成Silverlight应用.例子中会用到Bing Map 控件.完成后的效果图如下: 开发环境 本例中,我们使用到的开发环境包括: 1.Vis ...

  5. 如何在Windows 10的地图应用程序中获取离线地图

    If you know you're going to be using your PC in a location without an Internet connection, and you n ...

  6. 开发Windows贪吃蛇游戏——(二)代码实现

    目录 前言 窗体部分 Frame部分 声明全局变量 Panel的初始化 startGame方法 paintComponent方法 drawGame方法 newSnake方法 newFood方法 mov ...

  7. 把google地图 和 Bing地图 无缝集合到 ArcMap中 —— ArcBruTile

    前一段时间听师兄说有个ArcMap的插件,可以在ArcMap中打开google 地图和Bing地图,而且是带准确坐标那种.于是试了一下,感觉很不错,果然能够在ArcMap中打开,插件装完后是一个工具条 ...

  8. Bing地图服务和API分类

    原文在此: https://docs.microsoft.com/en-us/bingmaps/?redirectedfrom=MSDN#pivot=main&panel=BingMapsAP ...

  9. 2021.3.1 百度测试开发实习面试–百度地图一面

    2021.3.1 百度测试开发实习面试–百度地图一面 自我介绍你能实习多长时间呢?因为你所投的是测试开发岗位,那说说你对测试的理解?你最熟悉的语言的是什么语言?Java的死锁是因为什么?内存泄露与内存 ...

  10. 解决VS2008 开发Windows Mobile 项目生成速度慢的问题

    EnjoyIt.Zwg 体验精细管理 享受工作乐趣 解决VS2008 开发Windows Mobile 项目生成速度慢的问题 最近用VS2008开发Windows Mobile程序,使用C#..NET ...

最新文章

  1. keepalived+MHA实现mysql主从高可用集群
  2. php中strtotime(date,js模仿php中strtotime()与date()函数实现方法
  3. 财经法规税收征收管理法律制度练习题三
  4. SpringBoot笔记:SpringBoot2.3读取应用配置参数的几种方式
  5. mysqlclient==1.3.7对应mysql版本_「MySQL」CentOs 7 下安装MySQL
  6. 09 进程池的异步方法
  7. linux多级反馈队列的实现,多级反馈队列调度算法的实现
  8. 旅游吧!我在这里—旅游相册POI搜索:找回你的足迹
  9. php城市切换,城市切换 - 网下淘
  10. 多列堆积柱形图怎么做_#两列堆积柱形图怎么做#excel怎么做多列堆积图表??...
  11. 如何查看Safari浏览器network里Request的Payload
  12. 01.14_学习Java的day23(详解)
  13. access突然需要登录_登录信息提示
  14. lol8月7号服务器维护,LOL8月7日更新了什么内容 8.15新版本更新维护公告
  15. kali 2.0修改gnome登陆界面背景图片
  16. (1.5.1.3)编程之美:一摞烙饼的排序
  17. 柴达木盆地第四大气区探实 尖北产量超亿方
  18. 计算机408考研究竟有多难?
  19. cics查询oracle乱码,CICS安装和配置
  20. 福昕风腾完美越狱使用

热门文章

  1. Pycharm中的Django项目连接mysql数据库(包含出现的错误)
  2. byte 类型_Go 语言string 也是引用类型
  3. L2-027 名人堂与代金券 (25 分)—团体程序设计天梯赛
  4. L1-042 日期格式化 (5 分)—团体程序设计天梯赛
  5. Android Button 实现阴影边界
  6. UVA - 10534
  7. 中位数和顺序统计,以线性期望时间做选择
  8. java线程中yield(),sleep(),wait()区别详解
  9. 软件公司为什么要加密源代码,而且是前前后后,反反复复
  10. Activity 之间调用与参数传递