в моем проекте Какао, я общаюсь с устройством, подключенным к последовательному порту. Теперь я жду, когда последовательное устройство отправит конкретное сообщение из нескольких байтов. Для операции чтения (и реакции на получение желаемого сообщения) я создал новую ветку. По запросу пользователя я хочу иметь возможность отменить тему.
Как Apple предлагает в документах , я добавил флаг в словарь потоков, периодически проверяю, установлен ли флаг и, если да, вызываю [NSThread exit]
. Это отлично работает.
Теперь поток может застрять в ожидании, когда последовательное устройство наконец отправит 12-байтовое сообщение. Вызов чтения выглядит так:
numBytes = read(fileDescriptor, buffer, 12);
Как только поток начинает читать с устройства, но данные не поступают, я могу установить флаг, чтобы сообщить потоку об окончании, но поток не будет читать флаг, пока он, наконец, не получит как минимум 12 байтов данных и продолжает обработку.
Есть ли способ уничтожить поток, который в данный момент выполняет операцию чтения на последовательном устройстве?
Изменить для уточнения:
Я не настаиваю на создании отдельного потока для операций ввода-вывода с последовательным устройством. Если есть способ инкапсулировать операции, чтобы я мог их «убить», если пользователь нажал кнопку «Отмена», я был бы счастлив.
Я разрабатываю приложение Cocoa для настольных компьютеров Mac OS X, поэтому никаких ограничений в отношении мобильных устройств и их возможностей не накладывается.
Обходным решением будет немедленное возвращение функции чтения, если для чтения нет байтов. Как я могу это сделать?