Hi Bernd,

On Jun 4, 2010, at 1:28 AM, B. Ohr wrote:
> Hi,
> 
> yesterday I did my first steps with GCD: parsing a very big CSV-file, 
> processing and filtering it and displaying the result in a table view. Before 
> GCD the UI was blocked for more than a minute, now the user can continue 
> working instantly. Hey that’s really, really great!

:-)

> There are some issues I don’t understand:

:-(

> 
> 1. @job.group.notify(Dispatch::Queue.main) {}  # gives an error...
>   @job.group.notify(Dispatch::Queue.concurrent) {} # …..while is working
> 
> 2. @job.group.notify(Dispatch::Queue.concurrent) {}  # the block is called 
> twice or more times

Hmm, you should NOT need to call "group" on the @job for normal usage.  

Could you just use "@job.join" to get the behavior you want?

> 3. the proxy object does not work here (I’m not sure, that I am using it 
> correctly)

Yeah, the "+=" thing actually replaces the -variable- instead of mutating the 
object, so it won't do what you want. Look at the README.rdoc for more details:

http://github.com/masterkain/macruby/tree/master/lib/dispatch/

Sorry about the formatting...

-- Ernie P.



> 
> I made a small Xcode project demo out my project and attached it to this 
> mail. (you can multi-click on the job button)
> 
> - Bernd
> 
> ######
> 
> require 'dispatch'
> 
> class AppController
> 
> attr_accessor :calculations, :running
> 
> def initialize
>   self.calculations = []
>       @prefix = 1
>       @job = Dispatch::Job.new
>       #the main queue is used here because the UI is bound to the 
> calculations array 
>       @calc_queue = Dispatch::Queue.main
> end
> 
> def calc_sync &block
>   @calc_queue.async { block.call }
> end
>       
> def nextPrefix
>       prefix = @prefix
>       @prefix += 1
>       prefix
> end
> 
> def calc1
>       # @calc_proxy = 
> Dispatch::Proxy.new(self.calculations,@job.group,@calc_queue)
>       @job.add do
>         prefix = nextPrefix
>         10.times do |i|
>           dur = rand / 4 + 0.2
>               sleep(dur)
>           c = Calculation.new("#{prefix}:#{i}",dur)
>       calc_sync { self.calculations += [c] }
>       # proxy does not work here:
>               # @calc_proxy += [c]
>         end
>         #NSLog self.calculations.inspect
>       end
>       # why can the notify block be called twice ore more?
>       # if true
>       if !running
>         self.running = true
>         # notifying on the main queue is crashing here:
>         # @job.group.notify(@calc_queue) { NSLog "notify“; self.running = 
> false }
>         @job.group.notify(Dispatch::Queue.concurrent) { NSLog "notify"; 
> self.running = false }
>       end
> end
> 
> def jobAction sender
>   calc1
> end
> 
> def clearAction sender
>       self.calculations = []
> end
> 
> end
> 
> 
> <gcd_demo.zip>
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel@lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to