Поток прерывания по прошествии определенного времени, без блокировки во время ожидания - PullRequest
1 голос
/ 20 сентября 2011

Я бы хотел запустить поток в фоновом режиме и остановить его через определенное время, если он не завершится. Основная проблема заключается в том, что при ожидании завершения потока или таймера до завершения программа не должна блокироваться. Это важно гарантировать.

Я попытался в этом примере , но, ожидая timed_join, блокируется. Я должен объявить предупреждение о том, что некоторые вычисления выполняются.

void CallbackReceived() {
  boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(500);
  boost::thread thrd(&Foo);

  if (thrd.timed_join(timeout)) {
    //finished
  } else {
    //Not finished;
  }
}

Есть ли у вас какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Поток, который должен быть остановлен, может выйти сам по себе через определенное время.

Например, если он выполняет всю работу в цикле, он может периодически проверять (например, каждые 10 итерацийloop), если прошло максимальное количество времени, и выйдите в случае, если время прошло.

Время от времени основной поток может проверять поток, завершивший задание (или преждевременно завершивший), и удалять их.

0 голосов
/ 20 сентября 2011

Вы можете запустить поток, который запустит ваш поток, и ждать timed_join.

main
|
|---thread
|      |
|      |-----thread
|               |
|               |
|               |
|     join<------     
|
|

Но если вы просто хотите получить предупреждение, поместите его перед началом потока. Если это графическое приложение, и вы все еще хотите обрабатывать события, у вас должен быть доступен основной поток, как показано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...