Правильный способ остановить асинхронный ISearchJob

Я собираюсь использовать 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(); и у меня нет возможности правильно остановить мою программу.

Итак, мои вопросы:

  1. Как правильно остановиться? Асинхронный поиск работы для обновлений?
  2. Также я неправильно понял, в чем разница ISearchJob :: CleanUp а также ISearchJob :: RequestAbort и как использовать эти методы, чтобы правильно остановить асинхронный поиск?
  3. Должны ли эти методы использоваться вместе или по отдельности?

2

Решение

RequestAbort() также является асинхронным (намек на это есть в названии). После звонка, вы должны позвонить pUpSearcher_->EndSearch(); он вернет ISearchResult с ResultCode равно orcAborted если прерывание было успешным. затем Вы можете освободить свои ресурсы.

Я не совсем уверен, как CleanUp() предполагается использовать, но эта страница кажется, подразумевает, что он предназначен для сценариев, которые имеют обратные вызовы, и которые вы не должны вызывать CleanUp() из обратного вызова. Не уверен, где ваш код для отмены запуска.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]