Как прервать ReadLn из другого потока

В Free-Pascal я собираюсь создать кроссплатформенную консольную программу, которая будет выполнять большую часть своей работы в связке потоков (TThread).

Основная программа используется только для получения нескольких пользовательских команд время от времени и их выполнения (и для поддержания работы всей программы).

Этот цикл как основной цикл программы отлично работает как в Windows, так и в Linux без использования процессора:

repeat
  Write('> ');
  ReadLn(s);
  // execute command
until s='exit';

Но мне нужны потоки, чтобы заставить основную программу выполнить некоторую работу. Это означает, что мне нужен способ остановить ReadLn из другого потока, чтобы продолжить и проверить флаг команды. Если бы я мог каким-то образом отправить нажатие клавиши Enter, чтобы обмануть ReadLn, чтобы закончить, это было бы хорошо.

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


person Thomas Munk    schedule 13.03.2013    source источник
comment
Почему потоки не могут работать?   -  person Martin James    schedule 13.03.2013
comment
Он зависает в операторе ReadLn, который, кажется, удовлетворяет и Windows, и Linux, чтобы не использовать 100% загрузку процессора, как было бы в случае, если бы я повторил до нажатия клавиши.   -  person Thomas Munk    schedule 13.03.2013
comment
Мы это понимаем, но если есть работа, которую нужно сделать, почему «основная программа» должна это делать? Почему потоки не могут этого сделать?   -  person Martin James    schedule 13.03.2013
comment
Комментарий № 2 был для вопроса, который ушел. Потоки могут выполнять всю работу, но одно из заданий требует много записи состояния в консоль и никакого пользовательского ввода при этом. Так что прерывание ReadLn требуется в любом случае.   -  person Thomas Munk    schedule 13.03.2013


Ответы (1)


Да, используйте клавиатуру устройства. Эта абстрагированная поддержка клавиатуры позволяет просматривать события (клавиши), а это означает, что логический набор в потоке может привести к выходу из цикла.

См. блок клавиатуры в руководстве (rtl) и играх для текстовых консолей (fpctris, samegame), которые поставляются со стандартной установкой FPC.

person Marco van de Voort    schedule 13.03.2013