[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Threads and class variables

Alex Ciarlillo

12/4/2006 9:07:00 PM

I am trying to run 3 threads of a process using 3 sets of data. The
process is run from a class I made but for some reason when this certain
class method is called it seems to be getting the same data from each
thread. Here is the code I am using to create the threads:

threads = []
breakfast = ['breakfast', '12:00:a', '11:00:a']
lunch = ['lunch', '11:01:a', '4:00:p']
dinner = ['dinner', '4:01:p', '11:59:p']
periods = [breakfast, lunch, dinner]
locations = [0,1,2,3,4,5]
for period in periods
threads << Thread.new(period) {
puts "This threads variables: #{period[0]} #{period[1]}
#{period[2]}"
conn = Optim.new
conn.connect('user', 'pass')
res = conn.rtrvReport('SALES', date, date, period[1], period[2],
"C:\\Reporter\\data\\#{period[0]}_#{date.gsub('/','-')}.txt", locations)
if res
puts "Retrieved #{period[0]}_#{date.gsub('/','-')}"
else
puts "Failed on #{period[0]}_#{date.gsub('/','-')}"
end
}
end
threads.each { |aThread| aThread.join }

The rtrvReport method isnt fully implemented but I am trying to simply
print out the sTime variable to make sure each thread is passing a
different sTime. Here is what I have:

def rtrvReport(reportType, sDate, eDate, sTime, eTime, reportPath,
locations)
puts "Got this: #{sTime}"
end

sTime is passed from period[1]. The problem is even though in my for
loop for the thread creation it is reporting the correct variables but
in this little output statement it is printing the same variable. So how
can each thread be passing this method different variables but each time
it prints out the same one!?!? Here is sample output:

This threads variables: breakfast 12:00:a 11:00:a
This threads variables: breakfast 11:01:a 4:00:p
This threads variables: breakfast 4:01:p 11:59:p
Got this: 4:01:p
Got this: 4:01:p
Got this: 4:01:p

So any ideas on why this is? Also, anyone know a shorter/cleaner way to
setup the 4 arrays of data I'm using for the threads?
Thanks,
-Alex

--
Posted via http://www.ruby-....

2 Answers

Robert Klemme

12/4/2006 9:52:00 PM

0

On 04.12.2006 22:07, Alex Ciarlillo wrote:
> I am trying to run 3 threads of a process using 3 sets of data. The
> process is run from a class I made but for some reason when this certain
> class method is called it seems to be getting the same data from each
> thread. Here is the code I am using to create the threads:
>
> threads = []
> breakfast = ['breakfast', '12:00:a', '11:00:a']
> lunch = ['lunch', '11:01:a', '4:00:p']
> dinner = ['dinner', '4:01:p', '11:59:p']
> periods = [breakfast, lunch, dinner]
> locations = [0,1,2,3,4,5]
> for period in periods
> threads << Thread.new(period) {

You need to use a block parameter for "period" otherwise you will run
into this issue:

irb(main):035:0* for i in 1..5
irb(main):036:1> Thread.new(i) do |a|
irb(main):037:2* sleep 0.1
irb(main):038:2> puts "[#{i}-#{a}]"
irb(main):039:2> end
irb(main):040:1> end
=> 1..5
irb(main):041:0>
irb(main):042:0* [5-5][5-4][5-3][5-2][5-1]

As you see, "i" is the same var for all threads - only "a" is thread local.

Regards

robert

Ilan Berci

12/4/2006 9:59:00 PM

0

Alex Ciarlillo wrote:

>
> threads = []
> breakfast = ['breakfast', '12:00:a', '11:00:a']
> lunch = ['lunch', '11:01:a', '4:00:p']
> dinner = ['dinner', '4:01:p', '11:59:p']
> periods = [breakfast, lunch, dinner]
> locations = [0,1,2,3,4,5]
> for period in periods
> threads << Thread.new(period) {
> puts "This threads variables: #{period[0]} #{period[1]}
> #{period[2]}"

< snip>
>
> So any ideas on why this is? Also, anyone know a shorter/cleaner way to
> setup the 4 arrays of data I'm using for the threads?
> Thanks,
> -Alex

Alex,

Your thread is not passing it's constructor arg to the block as you are
not accepting it..
try:
threads << Thread.new(period) do | period|
puts "This threads variables: #{period[0]} #{period[1]}
end

p.s It's idiomatic to use do.. end for multiline blocks vs {}.. see
Pragmatic Guide to Ruby, Thomas, Hunt

as for making the arrays simpler, you could do:
periods = [%w(breakfast, 12:00, 13:00), %w(lunch, 14:00, 15:00),
%w{supper, 16:00, 17:00)]




--
Posted via http://www.ruby-....