2

Я пишу обертку ssh в объекте-c, я пытаюсь реализовать maxTime, которую должна выполнить команда для выполнения. Как я реализовать это:Как прояснить поток в заданное время в объекте-c

Главная Тема:

  1. высчитывает таймаут
  2. создать asyncThread (очередь НОД), чтобы выполнить команду и анализировать полученные данные
  3. waitForTimeoutOrSignal
  4. возвращаемый результат

AsyncThread:

  1. выполнить команду
  2. получить возвращаемые данные
  3. если получил правильный сигнал данных MainThread

В C# я имел хороший успех, используя ManualResetEvents сигнализировать MainThread. В Objective-C ближайший класс, который я могу найти, это NSCondition, но кажется, что он не построен для межпоточной связи.

На самом деле я получаю:

2012-05-22 00: 31: 05,761 libssh2-для-прошивкой [60821: 11303] ** - [NSCondition разблокировки]: условие («(нуль) «) отпирается нити, которая не запирала его

2012-05-22 00: 31: 05,763 libssh2-для-прошивки [60821: 11303] ** Перерыв на _NSLockError() для отладки.

, когда я пытаюсь его использовать. Есть ли другой способ использовать NSCondition или лучший способ для потока спать, пока он не получит какой-то сигнал?

+0

Есть около 20 способов (хорошо, может быть, преувеличение, но полдюжины), чтобы отправить событие таймера какого-то типа в поток. Но самое главное знать, что основной поток никогда не должен ждать. –

ответ

5

Оказывается, я был почти прав. Моя проблема (как было сказано в компиляторе) заключалась в том, что я блокировал один поток и разблокировал его в другом. То, что действительно решило, это изучение метода «сигнала» в NSCondition. Так что теперь я переписать код таким образом:

Worker № 1 Тема:

[NSCondition lock] 
start worker thread 
if([NSCondition waitUntil:maxTime]) 
    // got signal 
else 
    // timed out 
[NSCondition unlock] 

Рабочий # 2 Тема:

Do work 
[NSCondition signal] 
+2

Ожидание (за несколько миллисекунд) в основной теме - это не-нет. –

+0

Вы правы Hot Licks, обновили пример для рабочих тем №1 и №2 – whisperstream