У меня есть система с несколькими интерфейсами ввода / вывода, и я собираю вывод всех из них в общий журнал. Два интерфейса работают через каналы с хорошим поведением, которые открываются как файловые объекты, и ими можно управлять на основе событий с помощью «fileevent readable». Две другие проблемы.
Это относится к поставляемой поставщиком библиотеке, которую кто-то еще любезно обернул в пакет Tcl (snoopy, FWIW). Однако единственный доступ для чтения - это блокирующий вызов, и в пакете нет ничего, что могло бы вызвать событие, эквивалентное fileevent.
Я выяснил, как создать отдельный поток для блокировки чтения, получить результат и поместить его в очередь сообщений для основного потока. Но наличие блока основного потока при чтении очереди, казалось бы, отрицательно сказывается на цели, тем более что существует две очереди, на которые он должен был бы блокироваться. И я не смог заставить читателя сгенерировать событие, которое может вызвать основной поток для чтения очереди.
Я просмотрел вики tcl.tk безрезультатно. Я пытался использовать библиотеку uevent для генерации события при отправке сообщения, но событие переходит к потоку записи вместо потока чтения, что действительно не помогает. Кажется, что должно быть какое-то решение, связанное с переменной условия Thread, но до сих пор я не смог найти подходящий шаблон проектирования для этого использования библиотеки.
Если ничего не получится, я вернусь к событию Tk, но я пытаюсь не допустить этого к Tk, поскольку это автоматизированная система без GUI, и любое упоминание Tk толкает tclsh к желанию и всплывает окно с графическим интерфейсом.
Я чувствую, что я рядом, но что-то упускаю.