Package: libgtk2-ruby1.8 Version: 0.17.0~rc1-6 Severity: normal
I have a GTK program with a UI that is repeatedly updated from another thread using the technique described here: http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads If the updating thread doesn't sleep for *more* than 0.001s every iteration, the UI never gets updated. I tried adding Thread.pass to the working thread, but it didn't help. I expect the UI to be rendered even when another thread is working. Expected behavior of the sample code below is to display a window with a button saying "Flash Gordon". Current behavior is to display an empty gray window. I'm on ruby1.8 1.8.7.72-1. Regards //Johan === Begin sample code #!/usr/bin/ruby =begin This program has a GTK UI that is updated by a separate thread. The program doesn't work (the UI isn't even rendered) unless the updating thread sleeps for *over* 1ms sometimes. Search for FIXME to see what helps and what doesn't. The failing trials were run on Debian i686 with Ruby 1.8.7.72-1 and libgtk2-ruby1.8 0.17.0~rc1-6. [EMAIL PROTECTED] =end require 'gtk2' require 'monitor' # From http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads module Gtk GTK_PENDING_BLOCKS = [] GTK_PENDING_BLOCKS_LOCK = Monitor.new def Gtk.queue &block if Thread.current == Thread.main block.call else GTK_PENDING_BLOCKS_LOCK.synchronize do GTK_PENDING_BLOCKS << block end end end def Gtk.main_with_queue(timeout_ms = 100) Gtk.timeout_add timeout_ms do GTK_PENDING_BLOCKS_LOCK.synchronize do for block in GTK_PENDING_BLOCKS block.call end GTK_PENDING_BLOCKS.clear end true end Gtk.main end end # Create UI button = Gtk::Button.new("Hello World") window = Gtk::Window.new window.signal_connect("destroy") { Gtk.main_quit } # Lay out UI window.border_width = 10 window.add(button) window.show_all Thread.new { while true Gtk.queue do button.label = "Flash Gordon" end # FIXME: Sleeping 0.001s does not help: # sleep 0.001 # FIXME: Sleeping 0.0011s *does* help: # sleep 0.0011 # FIXME: Thread.pass does not help: # Thread.pass end } Gtk.main_with_queue === End sample code -- System Information: Debian Release: lenny/sid APT prefers testing APT policy: (990, 'testing') Architecture: i386 (i686) Kernel: Linux 2.6.26-1-686 (SMP w/2 CPU cores) Locale: LANG=sv_SE.UTF-8, LC_CTYPE=sv_SE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages libgtk2-ruby1.8 depends on: ii libatk1-ruby1.8 0.17.0~rc1-6 ATK bindings for the Ruby language ii libatk1.0-0 1.22.0-1 The ATK accessibility toolkit ii libc6 2.7-14 GNU C Library: Shared libraries ii libcairo2 1.6.4-6 The Cairo 2D vector graphics libra ii libgdk-pixbuf2-ruby1.8 0.17.0~rc1-6 Gdk-Pixbuf 2 bindings for the Ruby ii libglib2.0-0 2.16.6-1 The GLib library of C routines ii libgtk2.0-0 2.12.11-3 The GTK+ graphical user interface ii libpango1-ruby1.8 0.17.0~rc1-6 Pango bindings for the Ruby langua ii libpango1.0-0 1.20.5-2 Layout and rendering of internatio ii libruby1.8 1.8.7.72-1 Libraries necessary to run Ruby 1. libgtk2-ruby1.8 recommends no packages. libgtk2-ruby1.8 suggests no packages. -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]