hakeの日記

Windows環境でプログラミングの勉強をしています。

並行処理

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が同時に処理されるようになる。
この例では両メソッドともデータを出力するのみなので問題はないが、例えば一方のメソッドの出力をもう一方のメソッドで利用するような処理の場合は、こんなに簡単にはいかないと思う。

#!/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