On 29/07/07, Jeffrey Ratcliffe <[EMAIL PROTECTED]> wrote:
> That is an interesting idea I hadn't thought of. When I try it
> (ThreadDemo4.pl), I get
>
> GLib-CRITICAL **: g_hash_table_foreach: assertion `hash_table != NULL'
> failed at ./ThreadDemo4.pl line 23.
>
> on launching the app. But it almost works! On hitting the start
> button, it gets to 75% and then locks.

That last bit was not enough sleep. Now it works, but still gets the
GLib-CRITICAL error on launch, which I have no idea about.

Jeff

#!/usr/bin/perl

use warnings;
use strict;
use threads;
use threads::shared;
use Thread::Semaphore;
use Gtk2 qw(-init -threads-init);
use Glib qw(TRUE FALSE);             # To get TRUE and FALSE

Glib::Object->set_threadsafe (TRUE);

my $semaphore = Thread::Semaphore->new(0);
my @queue:shared;
my $process:shared;
my $die:shared;
my $thread = threads->new(sub {
 while (TRUE) {
  $semaphore->down;
  last if $die;
  eval $process;
 }
});

# Create the windows
my $window = Gtk2::Window->new('toplevel');
my $box = Gtk2::VBox->new;
my $pbar = Gtk2::ProgressBar->new;
my $buttonQuit = Gtk2::Button->new('Quit');
my $buttonStart = Gtk2::Button->new('Start');

$window->add ($box);
$box->add ($pbar);
$box->add($buttonQuit);
$box->add($buttonStart);

# We should also link this to the destroy message on the main window,
# this is just quick and dirty
$buttonQuit->signal_connect(clicked => sub{Gtk2->main_quit});
$buttonStart->signal_connect(clicked => sub{
 $process = '
  my $n = 4;
  for (my $i = 0; $i <= $n; $i++) {
   sleep(1);
   push @queue, $i/$n;
   push @queue, "Running $i of $n";
  }';
 $semaphore->up;
 Glib::Timeout->add (200, sub{
  if (@queue) {
   my $fraction = shift @queue;
   my $text = shift @queue;
   $pbar->set_fraction($fraction);
   $pbar->set_text($text);
   return FALSE if ($fraction == 1);
  }
  return TRUE;
 });
});
$window->show_all;
Gtk2->main;
$die = TRUE;
$semaphore->up;
$thread->join;
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to