C++ 停止异步作业的正确方法
我将以以下方式使用并开始执行异步更新搜索:C++ 停止异步作业的正确方法,c++,winapi,com,updates,wuapi,C++,Winapi,Com,Updates,Wuapi,我将以以下方式使用并开始执行异步更新搜索: CComPtr<SearchCallbackImpl> iscc_; <<-- Note you need to CreateInstance CComPtr<ISearchJob> pUpJob_; pUpJob_ = NULL; pUpSearcher_->BeginSearch( CComVariant(criteria.c_str()).bstrVal, iscc_,
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_);
通常这段代码是有效的,但有时它挂起在pUpJob\uuuu->CleanUp()上代码>和我没有能力正确停止我的程序
因此,我的问题是:
停止的正确方法是什么
我还误解了和之间的区别,以及如何使用此方法正确停止异步搜索
这些方法应该一起使用还是分开使用
RequestAbort()
也是异步的(名称中的提示)。调用它之后,您应该调用pUpSearcher\->EndSearch()
;如果中止成功,它将返回一个ISearchResult,其ResultCode
等于或aborted
。然后你可以释放你的资源
我不完全确定应该如何使用CleanUp()
,但似乎暗示它适用于具有回调的脚本,并且不应该从回调中调用CleanUp()
。不确定用于取消的代码在何处运行。我在类的析构函数中使用了此代码,它包装了WUAPI。如果我只执行pUpJob->RequestAbort()
而不执行pUpSearcher->EndSearch()
@SpaceRabbit,那会怎么样?我只是想知道你对这种情况的解决方案是什么?当由于程序退出而需要中止搜索时,我的算法会这样做:(1)BeginSearch(2)RequestAbort(3)Cleanup(4)NO EndSearch。问题有时是Cleanup()崩溃!我想知道当使用RequestAbort时,您是否需要调用Cleanup?如果您在这个线程中分享您对这个问题的最终解决方案,那就太好了,因为我现在遇到了一个类似的问题。但就我而言,CleanUp()崩溃了!
if (pUpJob_)
{
CComVariant isStopped;
pUpJob_->get_IsCompleted(&isStopped.boolVal);
if (isStopped.boolVal == VARIANT_FALSE)
{
if (SUCCEEDED(pUpJob_->RequestAbort()))
{
pUpJob_->CleanUp();
pUpJob_.Release();
}
}
}