キーワード
- ConditionVariable (11)
- Enumerator (11)
- Fiber (11)
- Queue (11)
- SizedQueue (11)
- Thread (11)
- ThreadGroup (11)
- WIN32OLE (11)
-
WIN32OLE
_ METHOD (11)
検索結果
-
Thread
:: ConditionVariable (55.0) -
スレッドの同期機構の一つである状態変数を実現するクラスです。
...レッド a に対して条件が成立したことを通知します。これが典型的な
使用例です。
mutex = Mutex.new
cv = ConditionVariable.new
a = Thread.start {
mutex.synchronize {
...
while (条件が満たされない)
cv.wait(m......tion Variable を使って wait しています。
require 'thread'
class TinyQueue
def initialize(max=2)
@max = max
@full = ConditionVariable.new
@empty = ConditionVariable.new
@mutex = Mutex.new
@q = []
end
def count
@q.size
end
def e......th = Thread.new {
for obj in foods
q.send(obj)
print "sent ", obj, "\n"
end
q.send nil
}
l.push th
th = Thread.new {
while obj = q.recv
print "recv ", obj, "\n"
end
}
l.push th
l.each do |t|
t.join
end
end... -
Fiber (43.0)
-
ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。 他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。
...= 例外
ファイバー実行中に例外が発生した場合、親ファイバーに例外が伝播します。
//emlist[例:][ruby]{
f = Fiber.new do
raise StandardError, "hoge"
end
begin
f.resume # ここでも StandardError が発生する。
rescue => e
p e.message #=> "hoge"
end
//......他のルーチンにコンテキストを切り替え、またそのポイントから再開する
という目的のために使います。
Fiber.new により与えられたブロックとともにファイバーを生成します。
生成したファイバーに対して Fiber#resume を呼ぶ......キストを切り替えます。
Fiber.yield の引数が、親での Fiber#resume の返り値になります。
//emlist[例:][ruby]{
f = Fiber.new do
n = 0
loop do
Fiber.yield(n)
n += 1
end
end
5.times do
p f.resume
end
#=> 0
1
2
3
4
//}
以下は内部イテレ... -
Thread (43.0)
-
スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。
...するスレッドを Thread#join で待っている他の
スレッドがある場合、その待っているスレッドに対して、同じ例外が再度
発生します。
begin
t = Thread.new do
Thread.pass # メインスレッドが確実にjoinするように
raise "un......handled exception"
end
t.join
rescue
p $! # => "unhandled exception"
end
また、以下の 3 つの方法により、いずれかのスレッドが例外によって終
了した時に、インタプリタ全体を中断させるように指定することができま
す。
*......ることができます。
p Thread.new {sleep 1} # => #<Thread:0xa039de0 sleep>
: run (実行or実行可能状態)
生成されたばかりのスレッドや Thread#run や
Thread#wakeup で起こされたスレッドはこの状態です。
Thread#join でスレッドの終了を待って... -
ThreadGroup (37.0)
-
スレッドグループを表すクラスです。グループに属する Thread をまとめて 操作することができます。
...成したすべてのThreadが終了するのを待つ
5.times {
Thread.new { sleep 1; puts "#{Thread.current} finished" }
}
(ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}
puts "all threads finished"
対象の Thread が Thread を起こす可......Default.list - [Thread.current]).each {|th| th.join}
end
=== ThreadGroup#freeze と ThreadGroup#enclose の違い
どちらのメソッドでも ThreadGroup#add によるスレッドの追加ができなくなる点は同じですが、
Thread.new に関して違いがあります。現在の......スレッドが属する ThreadGroup が freeze
されている場合、Thread.new{ ... } はエラーになります。ThreadGroup が enclose されているだけでは、
Thread.new{ ... } はエラーになりません。生成されたスレッドは従来通り 親スレッドの ThreadGroup... -
WIN32OLE (25.0)
-
OLEオートメーションサーバをRubyで操作するためのクラスです。
...数としてキーにパラメータ名、値に引数を指定できます。
=== サンプルコード
require 'win32ole'
excel = WIN32OLE.new('Excel.Application')
workbook = excel.Workbooks.Open('workbook.xls')
workbook.PrintOut
workbook.Close(:SaveChanges => false)
excel.Quit
な......にOLEオートメーションサーバのメソッド名は小文
字で記述しても構いません。
require 'win32ole'
excel = WIN32OLE.new('Excel.Application')
workbook = excel.workbooks.open('workbook.xls')
workbook.printout
workbook.close(:SaveChanges => false)
excel.quit
=......エラーとなります。
excel = WIN32OLE.new('Excel.Application')
Thread.start do
workbook = excel.Workbooks.Open('workbook.xls') #=> HRESULT error code:0x800401f0
workbook.PrintOut
workbook.Close(:SaveChanges => false)
end.join
excel.Quit
発生するエラーはThreadの... -
Enumerator (19.0)
-
each 以外のメソッドにも Enumerable の機能を提供するためのラッパークラスです。 また、外部イテレータとしても使えます。
...名前のイテレータについても each と同様に Enumerable の機能を利用できます。
Enumerator を生成するには Enumerator.newあるいは
Object#to_enum, Object#enum_for を利用します。また、一部の
イテレータはブロックを渡さずに呼び出すと繰......ます。
例えば以下のようなスレッドをまたいだ呼び出しはエラーになります。
//emlist[例][ruby]{
a = nil
Thread.new do
a = [1, 2, 3].each
a.next
end.join
p a.next
#=> t.rb:7:in `next': fiber called across threads (FiberError)
# from t.rb:7:in `<main>'
//}... -
Thread
:: Queue (13.0) -
Queue はスレッド間の FIFO(first in first out) の通信路です。ス レッドが空のキューを読み出そうとすると停止します。キューになんら かの情報が書き込まれると実行は再開されます。
...されています。
=== 例
require 'thread'
q = Queue.new
th1 = Thread.start do
while resource = q.pop
puts resource
end
end
[:resource1, :resource2, :resource3, nil].each{|r|
q.push(r)
}
th1.join
実行すると以下のように出力します。
$ ruby... -
Thread
:: SizedQueue (13.0) -
サイズの最大値を指定できる Thread::Queue です。
...れる行が同じ順序になります。
q = [] にすると入力と違った順序で行が出力されます。
require 'thread'
q = SizedQueue.new(1)
th = Thread.start {
while line = q.pop
print line
end
}
while l = gets
q.push(l)
end
q.push(l)
th.join... -
WIN32OLE
_ METHOD (13.0) -
OLEオートメーションサーバが持つメソッドの情報を提供します。
...= サンプルコード
excel = WIN32OLE.new('Excel.Application')
excel.ole_methods.each do |method|
if method.visible?
puts <<SIGNATURE
#{method.return_type} #{method.name}(#{
method.params.map {|p| "#{p.ole_type} #{p.name}"}.join(', ')
}) : #{method.helpstring}
SIGNATURE...