[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Thoughts on loops and stacks

Todd A. Jacobs

9/11/2007 7:01:00 PM

I was thinking about some of the design issues in my dice.rb script:

http://www2.codegnome.org:59321/scripting/showscript.php?scri...

and one of the major issues is queueing. I'd like to ensure that
selecting multiple URLs doesn't overwrite the current contents from the
previous X selection, so I was thinking what I needed to do was
implement a FIFO stack.

My main issues are that I don't want to miss any X selections, but at
the same time I don't want ruby running in such a tight loop that it
sucks up excessive CPU time.

Right now, I'm doing:

loop do;
# grab X selection
# time-consuming WWW::Mechanize stuff with selection
sleep 0.3
end

which isn't really event driven. So, if I select several URLs in quick
succession, only the URL in the X selection *the next time ruby looks at
it* gets handled.

Suggestions?

--
"Oh, look: rocks!"
-- Doctor Who, "Destiny of the Daleks"

2 Answers

ara.t.howard

9/11/2007 7:36:00 PM

0


On Sep 11, 2007, at 1:01 PM, Todd A. Jacobs wrote:

> Suggestions?
>


require 'thread'

q = Queue.new

consumer = Thread.new do
while(( pair = q.pop ))
event, data, *ignored = pair
case event
when :something
when :something_else
end
end
end

q.push [:somthing, 'some data']

...


a @ http://draw...
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




Robert Klemme

9/11/2007 9:09:00 PM

0

On 11.09.2007 21:01, Todd A. Jacobs wrote:
> I was thinking about some of the design issues in my dice.rb script:
>
> http://www2.codegnome.org:59321/scripting/showscript.php?scri...
>
> and one of the major issues is queueing. I'd like to ensure that
> selecting multiple URLs doesn't overwrite the current contents from the
> previous X selection, so I was thinking what I needed to do was
> implement a FIFO stack.

There is no such thing as a "FIFO stack". A stack has LIFO semantics -
a queue FIFO.

> My main issues are that I don't want to miss any X selections, but at
> the same time I don't want ruby running in such a tight loop that it
> sucks up excessive CPU time.
>
> Right now, I'm doing:
>
> loop do;
> # grab X selection
> # time-consuming WWW::Mechanize stuff with selection
> sleep 0.3
> end
>
> which isn't really event driven. So, if I select several URLs in quick
> succession, only the URL in the X selection *the next time ruby looks at
> it* gets handled.
>
> Suggestions?

If you have a single thread you can use an Array.

irb(main):022:0> q=[]
=> []
irb(main):023:0> 5.times {|i| q.push i}
=> 5
irb(main):024:0> until q.empty?; p q.shift; end
0
1
2
3
4
=> nil

Otherwise you can use a Queue as suggested by Ara. From your problem
description it seems you rather want a multithreaded solution.

Kind regards

robert