停止异步ISearchJob的正确方法
Correct way to stop asynchronous ISearchJob
我将使用WUA API,并以这种方式开始异步搜索更新:
CComPtr<SearchCallbackImpl> iscc_; <<-- Note you need to CreateInstance
CComPtr<ISearchJob> pUpJob_;
pUpJob_ = NULL;
pUpSearcher_->BeginSearch(
CComVariant(criteria.c_str()).bstrVal,
iscc_,
CComVariant(L"Scanning"),
&pUpJob_);
当我需要停止我的程序,但ISearchJob还没有完成时,我使用以下代码:
if (pUpJob_)
{
CComVariant isStopped;
pUpJob_->get_IsCompleted(&isStopped.boolVal);
if (isStopped.boolVal == VARIANT_FALSE)
{
if (SUCCEEDED(pUpJob_->RequestAbort()))
{
pUpJob_->CleanUp();
pUpJob_.Release();
}
}
}
通常这段代码工作,但有时它挂在pUpJob_->CleanUp();
上,我无法正确停止我的程序。
我的问题是:
- 停止异步搜索更新作业的正确方法是什么?
- 我也误解了ISearchJob::CleanUp和ISearchJob:: requestort之间的区别,以及如何使用这些方法来正确停止异步搜索?
- 这些方法应该一起使用还是单独使用?
RequestAbort()
也是异步的(其名称暗示了这一点)。调用后,应调用pUpSearcher_->EndSearch()
;如果中止成功,它将返回一个ISearchResult,其中ResultCode
等于orcAborted
。然后你可以释放你的资源。
我不完全确定CleanUp()
应该如何使用,但这一页似乎暗示它的目的是脚本有回调,你不应该从回调中调用CleanUp()
。不确定取消代码在哪里运行
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 停止异步ISearchJob的正确方法