Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 停止异步作业的正确方法_C++_Winapi_Com_Updates_Wuapi - Fatal编程技术网

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();
            }
        }
    }