هاسكل: كيفية الأنابيب محتويات مقبض واحد إلى آخر في الوقت الحقيقي

StackOverflow https://stackoverflow.com/questions/671610

  •  21-08-2019
  •  | 
  •  

سؤال

وأنا أكتب البرنامج الذي يدير عملية فرعية الخارجية بشكل تفاعلي وأنا في حاجة إلى محتويات مؤشر الانتاج ليكون الناتج إلى المعياري في أقرب وقت كما هو متاح. لقد حاولت شيئا من هذا القبيل:

main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
                                                    std_in  = CreatePipe }
       case processInfo of
          (Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
                                          hClose hIn
                                          hClose hOut
       _                              -> do error "Unable to start process"

mainloop :: Handle -> Handle -> IO ()
mainloop inh outh = 
    do ineof <- hIsEOF outh
       if ineof
          then return ()
          else do inpStr <- hGetLine outh
                  putStrLn inpStr
                  mainloop inh outh

ولكن هذا لا يعمل لأنه لا يعترف إلا خط الانتاج خط، لذلك أي الإخراج على التعامل مع عمليات الانتاج التي لم يتم إنهاؤها من قبل سطر جديد لا تظهر. لقد حاولت نفس الشيء مع hGetContents ولكنها تنتج نفس النتيجة. لقد قرأت من خلال توثيق كل من System.Process وSystem.IO و لم يتم العثور على أي شيء حقا قاطعة.

هل كانت مفيدة؟

المحلول

وhSetBuffering هو ما كنت أبحث عنه، الافتراضي (على يونيكس على الأقل) هو خط التخزين المؤقت. استخدامه على ستدين قبل بدء حلقة رئيسية

hSetBuffering hIn NoBuffering

وواختياريا أيضا على التعامل مع الانتاج اذا كنت تريد أن ترى النتائج على الفور على الجانب الانتاج. ولكن لاحظ أن تعطيل التخزين المؤقت يمكن أن تقلل بشكل كبير جدا الأداء.

نصائح أخرى

وأنا كثيرا مبتدئ هاسكل، ولكن أتذكر القادمة عبر مثالا مؤخرا من تجهيز إدخال حرف تلو الحرف. هل hSetBuffering ربما ما كنت تبحث عنه؟

وجارى هو شيء واحد، ولكن كنت تستخدم أيضا gGetLine التي سوف الانتظار للحصول على خط كامل (أو نهاية الملف). النظر في استخدام hGetChar إذا كنت تريد حقا أن قراءة حرف واحد في ذلك الوقت. وراجع للشغل، طريقة أخرى للتغلب على التخزين المؤقت لاستخدام hFlush.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top