並行処理
Rubyの勉強
複数の処理を同時に行う平行処理について実験してみる。
下のサンプルでは0から99までを表示するメソッドcnt1と、100から199までを表示するメソッドcnt2を、それぞれボタン1とボタン2に割り当てている。ボタン1を押してからボタン2を押すと表示される数字は、まず0〜99が表示されてから100〜199が表示される。
次に、先頭にrequire "thread"を追加、メソッドcnt1を以下の様に修正する。
require "thread" #追加 def cnt1 t = Thread.new do #追加 Thread.pass #追加 for i in 0..99 do @ebox1.insertLine(i.to_s) sleep 0.1 end end #追加 end
同じように、ボタン1を押してからボタン2を押すと、今度は0〜99の数字と100〜199の数字が混ざって表示されている。すなわちメソッドcnt1とcnt2が同時に処理されるようになる。
この例では両メソッドともデータを出力するのみなので問題はないが、例えば一方のメソッドの出力をもう一方のメソッドで利用するような処理の場合は、こんなに簡単にはいかないと思う。
- Rubyリファレンスマニュアル - Rubyスレッド(http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+%A5%B9%A5%EC%A5%C3%A5%C9)
- Rubyチュートリアル: Thread(http://www.ruby-lang.org/ja/20020315.html)(050720追加)
- Ruby/Qte普及委員会 - プログラミングTips - 非同期処理(http://noir.s7.xrea.com:8080/rubyqte/pukiwiki.php?%5B%5B%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0Tips%5D%5D)
#!/usr/bin/env ruby require "qte" require "qpe" #require "thread" include Qte include Qpe class SampleWindow < QMainWindow def initialize() super() setCaption(tr("サンプル")) @msg = QLabel.new(tr("これはサンプルプログラム"),self) @msg.setGeometry(10,10,300,30) @ebox1 = QMultiLineEdit.new(self) @ebox1.setGeometry(0,100,635,300) @ebox1.setReadOnly(true) @pb1 = QPushButton.new(tr("ボタン1"),self) @pb1.setGeometry(320,5,100,30) connect(@pb1,QSIGNAL("clicked()"), self, 'cnt1') @pb2 = QPushButton.new(tr("ボタン2"),self) @pb2.setGeometry(430,5,100,30) connect(@pb2,QSIGNAL("clicked()"), self, 'cnt2') end def cnt1 # t = Thread.new do # Thread.pass for i in 0..99 do @ebox1.insertLine(i.to_s) sleep 0.1 end # end end def cnt2 for i in 100..199 do @ebox1.insertLine(i.to_s) sleep 0.1 end end end $defaultCodec = QTextCodec.codecForName("utf8") app = QPEApplication.new([$0]+ARGV) app.setDefaultCodec($defaultCodec) QApplication.setFont(QFont.new("lcfont",18)) app.showMainWidget(SampleWindow.new) app.exec