Swift 4: убить исполняющий поток с помощью функции вызываемого моста c ++ - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть c ++ API, который подключен через файл моста. Внутри этого API есть функция, которая, к моему сожалению, имеет бесконечный цикл, который ожидает поступления данных.

Я вызываю эту функцию, когда пользователь нажимает кнопку пуска, через:

   workItem = DispatchWorkItem {
     foo()
   }
   DispatchQueue.global(qos: .background).async(execute: workItem!)

Функция заполнения переменных внутри алгоритма c ++, в частности, массивы предоставленных данных.

Когда пользователь нажимает кнопку остановки, я прекращаю эту тему с помощью:

self.workItem?.cancel()

Единственная проблема в том, что он не убивает этот поток, а очищает память. Я знаю это, потому что когда пользователь снова нажимает кнопку запуска, он продолжает работать со старыми данными в массивах c ++

Есть ли способ убить этот конкретный поток и очистить память, чтобы при каждом запуске / остановке пользователь запускал новый сеанс

1 Ответ

0 голосов
/ 30 апреля 2018

Что касается GCD, WorkItem Cancel - это не что иное, как эквивалент dispatch_block_cancel .

По этой аналогии блоки, которые уже начали выполнение, не останавливаются. Только рабочие элементы, ожидающие выполнения, потенциально могут быть остановлены.

После остановки вам, возможно, придется вручную отменить то, что фактически сделал WorkItem, если он уже выполнял его ранее.

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