Class: MainLoop::Bus
- Inherits:
-
Object
- Object
- MainLoop::Bus
- Includes:
- MonitorMixin
- Defined in:
- lib/main_loop/bus.rb
Constant Summary collapse
- EOL =
Константа конца строки (end of line)
"\n".freeze
Instance Attribute Summary collapse
-
#read ⇒ IO
readonly
конец канала для чтения.
-
#write ⇒ IO
readonly
конец канала для записи.
Instance Method Summary collapse
-
#close ⇒ Object
Закрытие канала.
-
#closed? ⇒ Boolean
Проверка закрытости канала.
-
#empty?(timeout = 0) ⇒ Boolean
Проверка наличия событий.
-
#gets(timeout) ⇒ String|nil
Блокирующее чтение события.
-
#gets_nonblock ⇒ String|nil
Неблокирующее чтение строки.
-
#initialize ⇒ Bus
constructor
Инициализация.
-
#puts(str) ⇒ Object
Отправка события.
-
#wait_for_event(timeout) ⇒ Array<IO>|nil
Ожидание события.
Constructor Details
#initialize ⇒ Bus
Инициализация
Создает IO.pipe, настраивает синхронный режим, инициализирует буфер.
47 48 49 50 51 52 53 |
# File 'lib/main_loop/bus.rb', line 47 def initialize super() @read, @write = IO.pipe @read.sync = true @write.sync = true @buffer = '' end |
Instance Attribute Details
#read ⇒ IO (readonly)
Returns конец канала для чтения.
47 48 49 |
# File 'lib/main_loop/bus.rb', line 47 def read @read end |
#write ⇒ IO (readonly)
Returns конец канала для записи.
47 48 49 |
# File 'lib/main_loop/bus.rb', line 47 def write @write end |
Instance Method Details
#close ⇒ Object
Закрытие канала
Закрывает оба конца канала (read и write). Ошибки закрытия игнорируются (rescue nil).
72 73 74 75 |
# File 'lib/main_loop/bus.rb', line 72 def close @write.close rescue nil @read.close rescue nil end |
#closed? ⇒ Boolean
Проверка закрытости канала
80 81 82 |
# File 'lib/main_loop/bus.rb', line 80 def closed? @write.closed? || @read.closed? end |
#empty?(timeout = 0) ⇒ Boolean
Проверка наличия событий
Проверяет, есть ли события в канале.
61 62 63 |
# File 'lib/main_loop/bus.rb', line 61 def empty?(timeout = 0) !wait_for_event(timeout) end |
#gets(timeout) ⇒ String|nil
Блокирующее чтение события
Блокирует до получения события или таймаута. Использует Timeouter.loop для ограничения времени ожидания.
116 117 118 119 120 121 |
# File 'lib/main_loop/bus.rb', line 116 def gets(timeout) Timeouter.loop(timeout) do |t| line = gets_nonblock if wait_for_event(t.left) return line if line end end |
#gets_nonblock ⇒ String|nil
Неблокирующее чтение строки
Читает посимвольно до конца строки (EOL). Буферизует символы и возвращает полную строку.
129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/main_loop/bus.rb', line 129 def gets_nonblock while (ch = @read.read_nonblock(1)) @buffer << ch next if ch != MainLoop::Bus::EOL line = @buffer @buffer = '' return line&.strip end nil rescue IO::WaitReadable nil end |
#puts(str) ⇒ Object
Отправка события
Отправляет строку в канал с потоко-безопасной синхронизацией. Автоматически добавляет конец строки.
93 94 95 96 97 |
# File 'lib/main_loop/bus.rb', line 93 def puts(str) synchronize do @write.puts str.to_s end end |
#wait_for_event(timeout) ⇒ Array<IO>|nil
Ожидание события
Использует IO.select для ожидания события в канале.
105 106 107 |
# File 'lib/main_loop/bus.rb', line 105 def wait_for_event(timeout) IO.select([@read], [], [], timeout) end |