2013-12-23 50 views
0

我對Ruby線程相當陌生,所以有人可以讓我知道我在做什麼錯了嗎?紅寶石線程:複製期間的進度條

require 'fileutils' 
require 'zip' 
require 'rubygems' 
require 'progressbar' 

oraclePath = "\\\\server\\Oracle Client\\Oracle_11gR2\\win64_11gR2_client.zip" 

begin 
tmpDir = Dir.mktmpdir("ora-") 

progress = Thread.new(){ 
    Thread.current[:name] = "FileProgress" 

    sourceFileSize = File.size("#{oraclePath}") 
    batch_bytes = (in_size/100).ceil 
    total  = 0 
    p_bar  = ProgressBar.new('Copying', 100) 

    buffer  = "#{oraclePath}".sysread(batch_bytes) 
    while total < sourceFileSize do 
    "#{tmpDir}".syswrite(buffer) 
    p_bar.inc 
    total += batch_bytes 
    if (sourceFileSize - total) < batch_bytes 
     batch_bytes = (sourceFileSize - total) 
    end 
    buffer = "#{oraclePath}".sysread(batch_bytes) 
    end 
    p_bar.finish 
} 

progress.run 

puts "#{tmpDir}" 
FileUtils.cp_r("#{oraclePath}","#{tmpDir}") 
Zip::File.open("#{tmpDir}/win64_11gR2_client.zip") do |zipfile| 
    `unzip -j #{zipfile} -d #{dir}` 
    #zipfile.each do |file| 
    #zipfile.extract(file, "#{tmpDir}") 
    #end 
end 

ensure 
    # remove the temp directories 
    FileUtils.remove_entry_secure tmpDir 
end 

複製工作,但線程沒有 - 我甚至不能進入它;它只是完全跳過它。

+0

我不知道我理解。如果複製成功,則線程正在運行。你爲什麼認爲它不是? – Donovan

+0

我指的是「進度」線程 – MrDuk

+0

當然是的,但這並不能回答我的問題。我試圖回答給出的信息。讓我知道,如果這沒有幫助你指向正確的方向。 – Donovan

回答

0

Ruby線程將在它被實例化爲Thread.new時開始運行,因此在您的示例中,副本立即開始,並且行progress.run不是必需的。

如果線程本身已停止(即在等待進一步的指令時自己調用stop),則只需要調用run

作爲參考,你可以在這裏找到更多的信息:http://ruby-doc.org/core-2.0.0/Thread.html

+0

我不知道我明白我所看到的。我在新線程中有斷點,但他們永遠不會被擊中。這就像當我步入*線程時,它實際上只是跳過它。 – MrDuk

+0

難道你的編輯器不支持進入線程(他們是一個單獨的進程,畢竟)? – Donovan

+0

我正在使用最新版本的RubyMine - 我沒有檢查過,但我認爲它是支持線程的行業標準IDE? – MrDuk