2013-11-13 7 views
93

Все операции с портами в Rebol 3 являются асинхронными. Единственный способ найти синхронную связь - позвонить wait.Избегайте рекурсии при чтении/записи порта синхронно?

Но проблема с вызовом wait в этом случае заключается в том, что он проверит события для всех открытых портов (даже если они не находятся в портовом блоке, прошедшем для ожидания). Затем они называют свои обработчики обработчиков событий, но чтение/запись может выполняться в одном из этих обработчиков событий. Это может привести к рекурсивным вызовам «wait».

Как мне обойти это?

+8

На самом деле, я не думаю, что есть решение этого в текущей реализации R3, поэтому я пошел, чтобы добавить уточнение «/ only», чтобы «подождать», с которым он будет ждать только порты, предоставленные «wait» и, таким образом, избежать рекурсивных вызовов. Посмотрите мой запрос на тягу по адресу: https://github.com/rebol/rebol/pull/177 –

+1

Из любопытства, зачем вам это нужно синхронно? – toadzky

+1

Существует много ситуаций, когда кодирование с синхронным портом намного проще: предположите, что вы хотите отправить электронное письмо одним нажатием кнопки и сообщить, успешно ли оно или не удается. Гораздо легче дождаться, когда это закончится, прежде чем делать что-либо еще. –

ответ

0

Вы можете просто использовать замок. Cummunication1 может установить некоторое глобальное состояние блокировки, то есть с переменной (убедитесь, что она потокобезопасна). locked = true. Тогда Communication2 может ждать, пока он не будет разблокирован.

loop do 
    sleep 10ms 
    break if not locked 
end 
locked = true 
handle_communication() 
+1

На самом деле это больше вопрос о Rebol 3, чем синхронная связь в целом. –

1

в тех случаях, когда имеются только асинхронные события, и мы нуждаемся в синхронном ответ, запустить таймер или сон для тайм-аута, если обработчик или требуется цель была достигнута, то говорят, правда, еще ложь и убедитесь, событие будет отменено/сброшено для того же, если оно критическое.

1

Почему вы не создаете функцию «Буфер», чтобы получать все сообщения от assyncronous записей и обрабатывать их как FIFO (first-in, first-out)?

Таким образом, вы можете сохранить характеристики Assync своих портов и обработать их в режиме синхронизации.