Witajcie.
Piszę program w Ruby, który generuje mi obrazki - konkretnie 5036 obrazków o wymiarach 128x128.
Posiadam macierz 5036x64, w której kolejne wiersze posiadają wartości 0-16(0-czarny, 16-biały) - na ten podstawie poszczególne piksele “koloruje”.
Problem jednak w tym, że w dość losowym momencie program potrafi mi się zawiesić. Tzn. na liście procesów dalej go widzę, zajmuje dość sporo % mocy obliczeniowej, więc tak jakby “liczył” ale nie ma postępu - nie pojawiają się nowe obrazki, nie wyświetla mi się informacja, żeby przetworzył kolejny obrazek… do testów nawet ująłem tą czasochłonną pętlę blokiem timeout, i nie reaguje na nią…
Poniżej zamieszczam kod - jeśli ma ktoś jakiś pomysł, co może z nim być nie tak (lub ew. prośba o info, czy u Was działa normalnie).
Z góry dzięki za wszelką pomoc.
Aha, Od razu mówię, że to okrojona, wczesna koncepcja - mam bardziej zaawansowaną, rozdzielająca ten syf na wątki - ale niech najpierw zadziała taka możliwie prosta, cudować będę potem
[code=ruby]## main.rb
require ‘timeout’
require “Image.rb”
@img = Image.new
@start = Time.now
@threads = []
Timeout::timeout(100) do
File.new(“Digits_tra.txt”, “r”).each_with_index { |element, @index|
targets= element.split("\t")
targets.delete(targets[-1])
@img.draw(targets, @index)
}
end
@end = Time.now
@time = @end - @start
@avg_time = @time / (@index +1)
puts “±-----------------------------------------------+”
puts “| Czas startu: \t\t\t | #{@start.strftime(”%H:%M:%S")} \t | \n"
puts “| Czas zakonczenia: \t\t | #{@end.strftime(”%H:%M:%S")} \t | \n"
puts “| Przetworzonych obiektow: \t | #{@index+1} \t | \n”
puts “| Czas przetwarzania: \t\t | #{sprintf(’%.2f’ ,@time).to_f} \t | \n”
puts “±-----------------------------------------------+”
Image.rb
require ‘rubygems’
require ‘RMagick’
class Image
def initialize
@image_size = 128
@image = Magick::Image.new(@image_size, @image_size)
@size = @image_size / 8
end
def draw(data, num)
x = 0
y = 0
65.times do |i|
@data = Magick::Draw.new
color = 16 * data[i].to_i
@data.fill(“rgb(#{color},#{color},#{color})”)
@data.rectangle(x, y, x + @size, y + @size)
x += @size
x = 0 if (i % 8 == 0 && i != 0)
y += @size if (i % 8 == 0 && i != 0)
@data.draw(@image)
end
if File.exists?(“images/#{num}.png”)
raise “Probujesz nadpisac plik #{num} !”
end
@image.write(“images/#{num}.png”)
puts “Przetworzono obrazek #{num}”
end
end[/code]
Ponieważ macierz jest dość duża, wrzucą ją wklej.org
Aha, garść info o platformie testowej:
ruby -v
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.4.0]
gem list | grep rmag*
rmagick (2.13.1)
convert -version
Version: ImageMagick 6.6.4-5 2010-11-09 Q16 http://www.imagemagick.org