zoukankan      html  css  js  c++  java
  • 开发 Windows 8 Bing地图应用(4)

    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,启动优化操作时,引发的操作流程。

    clip_image002

  • 相关阅读:
    Java 中Timer和TimerTask 定时器和定时任务使用的例子
    PowerDesigner逆向工程导入MYSQL数据库总结
    Powerdesigner 连接mysql 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM014
    关于web.xml中的<welcome-file-list>
    SQL查询四舍五入 解决方法
    HTML页面跳转的5种方法
    easyUI datagrid 列宽自适应(简单 图解)(转)
    navicat for mysql只导出数据表结构(转)
    每一位想有所成就的程序员都必须知道的15件事(走不一样的路,要去做,实践实践再实践,推销自己,关注市场)good
    2017除夕夜的感悟:学习工作不分家,工作生活不分家,读书用兵不分家
  • 原文地址:https://www.cnblogs.com/finehappy/p/2858184.html
Copyright © 2011-2022 走看看