From: Masato Toyoshima Date: 2000-04-25T05:52:21+09:00 Subject: [ruby-list:22097] Thread & STDIN.getc Ruby-listの皆さん、こんにちは 豊島%自己フォローです。 Cygwin版のRubyでテストしております。 入力用の領域と表示用の領域に画面を分けて、キーボード入力を得ている間も、 Socketで受信したデータを加工して、表示用の領域に表示しつづけるといった 動作を実現したいと思っています。 現在、キーボード入力を得ると、表示がとまってしまい、それをどうしたら 回避できるか、頭を悩ませております。 お知恵を拝借できると幸いです。 Cygwin版で引き続き、表示用と入力用のスレッドのテストを行った結果の 報告です。今回は下記のようなテストスクリプトで実験してみました。 スレッドにカウンターを設けて、何文字か入力して待って、カウンターの 変化を見てみるという実験です。 結果は、 一文字だけ入力した場合、数分待っても、 エンターを押す前と押した後のカウンターは同じ値 一文字目の入力時119 Enter入力後119 入力文字数1 長文を入力した場合、異なる場合もあり 一文字目の入力時369 thread 371 thread 372 thread 373 thread 374 thread 375 (Cut) thread 429 thread 430 thread 431 Enter入力後432 入力文字数56 といった感じの結果となりました。 一文字(あるいは数文字?)だけの入力だと、ずっと表示用のスレッドがとまって います。また文字数に関わらずエンターが押されるまでは、printは抑止されます。 Cygwin版では難しいのかも知れませんね。 STDIN.getc以外にキーボード入力を得る方法ってあるのでしょうか? 間違いなど、お気づきのところがありましたら、ご指摘いただけると嬉しいです。 よろしくお願いいたします。 ==テストスクリプト require "thread" b=1 z=Thread.start{ while true print " thread ",b b=b+1 end } nwrite=nil while true nstdin=nil nstdin=STDIN.getc case nstdin when nil pass when ?\n case nwrite when nil print "\n" else print "\nEnter入力後",b,"\n" print "入力文字数",nwrite.length,"\n" nwrite<<"\n" print nwrite nwrite=nil exit end else case nwrite when nil print "一文字目の入力時",b,"\n" nwrite = nstdin.chr else nwrite << nstdin.chr end end end ==ここまで =========================================== ^^ ^^ mailto:mt@izu.co.jp ^^ ^^ ^^ ^^ ^^ 豊島 正登 Masato Toyoshima ^^ ^^