[MacRuby-devel] some gcd issues

Ernest N. Prabhakar, Ph.D. prabhaka at apple.com
Fri Jun 4 10:03:26 PDT 2010


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, at job.group, at 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 at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list