【问题标题】:Correct way to stop asynchronous ISearchJob停止异步 ISearchJob 的正确方法
【发布时间】:2016-10-13 10:23:28
【问题描述】:

我将使用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_-&gt;CleanUp(); 上,我无法正确停止我的程序。

所以我的问题是:

  1. 停止asynchronous search job for updates的正确方法是什么?
  2. 另外我误解了ISearchJob::CleanUpISearchJob::RequestAbort 之间的区别以及如何使用这些方法正确停止异步搜索?
  3. 这些方法应该一起使用还是单独使用?

【问题讨论】:

    标签: c++ winapi com updates wuapi


    【解决方案1】:

    RequestAbort() 也是异步的(暗示在名称中)。调用后应调用pUpSearcher_-&gt;EndSearch();如果中止成功,它将返回一个 ResultCode 等于 orcAborted 的 ISearchResult。 然后你可以释放你的资源。

    我不完全确定应该如何使用 CleanUp(),但 this page 似乎暗示它适用于具有回调的脚本,并且您不应该在回调中调用 CleanUp() .不确定您的取消代码在哪里运行。

    【讨论】:

    • 我在我的类的析构函数中使用这段代码,它包装了 WUAPI。
    • 如果我只做pUpJob_-&gt;RequestAbort()而不做pUpSearcher_-&gt;EndSearch()会怎么样
    • @SpaceRabbit 只是好奇你对这种情况的解决方案是什么?当由于程序退出而需要中止搜索时,我的算法会执行此操作:(1) BeginSearch (2) RequestAbort (3) Cleanup (4) NO EndSearch。问题有时是 Cleanup() 崩溃!我想知道在使用 RequestAbort 时您是否甚至需要调用 Cleanup?
    • @SpaceRabbit 如果你在这个线程中分享你对这个问题的最终解决方案会很棒,因为我现在遇到了类似的问题。但在我的情况下 CleanUp() 崩溃了!
    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2015-10-03
    • 2013-03-14
    • 1970-01-01
    • 2010-09-26
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多