Ожидание на двух исходных данных в Haskell, одновременно

Заголовок может быть немного неопределенным. Это - то, что я имею в виду:

Скажите, что у меня есть два способа быть введенным к моей программе. Первое через клавиатуру, с помощью функции getLine какие блоки, пока строка не читается. Другой, скажем, через a TChan, где использование readTChan chan также приведет к блоку, пока значение не будет присутствовать в канале, после чего оно будет считано.

То, что я хочу выполнить, является способностью ожидать обоих значений, с помощью единственного потока и не позволяя моему ЦП перейти к 100%. Момент одно из двух значений доступно, оно выбирается и резюме программы. (Скажите, с помощью Either уведомлять, какое из двух значений было получено.)

Действительно ли это возможно?

Большое спасибо!

9
задан Don Stewart 18 April 2011 в 18:37
поделиться

2 ответа

Я не думаю, что «используя одну нить» имеет смысл здесь. Вы уже должны использовать несколько потоков Haskell в любом случае для записи в Tchan . Вы должны использовать два потока Haskell, чтобы сделать это и использовать MVAR или аналогичный для передачи первого результата для прибытия. Например:

module Main where

import System.IO
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Concurrent.STM
import Control.Concurrent.STM.TChan

main = do
   chan <- newTChanIO
   forkIO (threadTChanWrite chan)
   threadMultiplexedRead chan

threadTChanWrite chan = do
   threadDelay 5000000
   atomically $ writeTChan chan 3

threadMultiplexedRead chan = do
   mvar <- newEmptyMVar
   forkIO (threadKeyboardRead mvar)
   forkIO (threadTChanRead mvar chan)
   v <- readMVar mvar
   print v

threadKeyboardRead mvar = do
   str <- getLine
   putMVar mvar (Right str)

threadTChanRead mvar chan = do
   v <- atomically (readTChan chan)
   putMVar mvar (Left v)

Правильная реализация, вероятно, очистит темы, оставленные, лежащие потом, кстати.

12
ответ дан 4 December 2019 в 10:32
поделиться

Можно изменить значок приложения в самом приложении Windows. И поместите это приложение в проект установки.

Щелкните правой кнопкой мыши по проекту WinApp и в разделе Приложение выберите и Значок , который будет ico-файлом. Найдите файл значка и выберите его . Создайте проект и присоедините его к проекту настройки.

-121--2122302-

Посмотрите на этот вопрос .

-121--2805605-

У меня есть два способа ввода в мою программу

Вы должны иметь возможность использовать 2 потока, по одному на источник ввода, которые ожидают на своих соответствующих входах, записывая результат в общий канал или mvar, управляемый третьим потоком.

5
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: