LINUX.ORG.RU

синхронизация двух циклов


0

0

Пишу интерактивную оболочку к интерпретатору ЯП (aka repl/toplevel/interactive shell/...). Как сделать консольный вариант - ясно, не понятно как совместить цикл интерпретатора toplevel() с gtk_main(). Из toplvel() наружу торчат две переопределяемые функции для работы с входным/выходным потоками, которые по поведению должны совпадать с read(2)/write(2) соответственно. При этом хочется, чтобы, в то время как интерпретатор что-то там пережевывает, интерфейс не блокировался и можно было, скажем, прибить зациклившуюся программу.

Наверно надо смотреть в сторону многопоточности, но я с этим дел не имел до этого. Может можно как-то попроще? Ну и, вообще, я несколько в растерянности, посоветуйте чего-нибудь.

Ответ на: комментарий от temp

> Пускай в отдельном процессе, и гоняй данные по ipc.

Челябинская суровость... Чем терминал не ипц? Просто надо read и write с терминала делать под управлением гткшного mainloop'а.

const86 ★★★★★
()
Ответ на: комментарий от const86

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


>Просто надо read и write с терминала делать под управлением гткшного mainloop'а.


Не получится. Во всяком случае это точно сложней и затратней чем разобраться и организовать два потока. Дело в том, что toplevel() не представляет из себя просто последовательные вызовы {read(); eval(); write();}. Более того, вызывать read/write руками вообще нельзя, они дергаются изнутрей цикла по нескольку раз за итерацию в неочевидном порядке. То есть эмулировать поведение топлевел() вручную не выйдет.

turbosnail
() автор топика

> Наверно надо смотреть в сторону многопоточности

Учитывая

> и можно было, скажем, прибить зациклившуюся программу.

Обязательно.

> но я с этим дел не имел до этого.

Это не так уж и сложно, по POSIX в общих чертах тут

http://www.cs.cf.ac.uk/Dave/C/node29.html

Ну а с виндой - в MSDN

iBliss
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.