All,
 
I found the threads example posted in this group and began playing around.  I've modified the code to add a splash screen using Win32::GUI:SplashScreen, a timer taken from Tutorial_Part4_timer.pl, a statusbar, and a notifyicon.  For some reason the timer never gets fired.  I've tried removing the splashscreen and threads but it still won't fire.  The tutorial works ... why doesn't this:
 

#!/perl -w

use strict;
use warnings;
$|=1;

use Win32::GUI;
use Win32::GUI::SplashScreen;

use threads;
use threads::shared;
use Thread::Queue;

## Create worker threads and associated variables.
## -- THIS MUST BE DONE, AND ALL THREADS STARTED
## -- BEFORE THE WINDOW IS CREATED.
my $TQ1 = new Thread::Queue;
my $TQ2 = new Thread::Queue;

my $ts1_run : shared = 0;
my $ts2_run : shared = 0;

my $t1_objHandle : shared = 0;
my $t2_objHandle : shared = 0;

my $thread1 = threads->new(\&Thread1);
my $thread2 = threads->new(\&Thread2);


## Hide Perl Window
my $perlW = Win32::GUI::GetPerlWindow();
#Win32::GUI::Hide($perlW);


# Create and diaplay the splash screen
Win32::GUI::SplashScreen::Show(
 -file      => "splash.bmp",  # set a name that doe not exist to force internal splash screen
 -mintime   => 3,
);


# Hide the splash - blocks until the splashscreen is removed
Win32::GUI::SplashScreen::Done();


## Create Window
my $win = new Win32::GUI::Window(
        -name  => 'winMain',
        -title  => "My Main Window",
       -size   => [700, 500],
       -onResize => \&resizeWin,
);
my $t1 = $win->AddTimer('T1', 1000); # never calls sub T1_Timer

$win->AddButton(
        -name   => 'btnRun1',
        -size   => [50,20],
        -pos    => [4,10],
        -text   => 'Run 1',
);

$win->AddProgressBar(
        -name   => 'pbT1',
        -size   => [120,20],
        -pos    => [58,10],
        -smooth => 1,
);
$win->{pbT1}->SetRange(0,99);
$t1_objHandle = $win->{pbT1}->{-handle};

$win->AddButton(
        -name   => 'btnRun2',
        -size   => [50,20],
        -pos    => [4,32],
        -text   => 'Run 2',
);

$win->AddProgressBar(
        -name   => 'pbT2',
        -size   => [120,20],
        -pos    => [58,32],
        -smooth => 1,
);
$win->{pbT2}->SetRange(0,99);
$t2_objHandle = $win->{pbT2}->{-handle};

my $sb = $win->AddStatusBar();

my $icon = new Win32::GUI::Icon('d:/source/perl/auditutil/images/data_server.ICO');
my $ni = $win->AddNotifyIcon(
        -name => "NI",
        -icon => $icon,
        -tip => "Hello"
);

$win->Center();
$win->Show();
Win32::GUI::Dialog();

 

#### Boss
sub winMain_Maximize{ 0 };
sub winMain_Minimize{ 0 };
sub winMain_Resize{ 0 };
sub winMain_Terminate{
 $ts1_run = -1;
 $ts2_run = -1;
 #join workers.
 $thread1->join();
 $thread2->join();
 $win->NI->Remove();
 $win->Hide();
 return -1;
}

sub btnRun1_Click{
 print "clicked btnRun1 \n";
 if($ts1_run){
  $win->{btnRun1}->Text('Run 1');
  $ts1_run = 0;
 }else{
  $win->{btnRun1}->Text('Stop 1');
  $ts1_run = 1;
 }
 return 1;
}

sub btnRun2_Click{
 if($ts2_run){
  $win->{btnRun2}->Text('Run 2');
  $ts2_run = 0;
 }else{
  $win->{btnRun2}->Text('Stop 2');
  $ts2_run = 1;
 }
 return 1;
}

sub resizeWin {
 $sb->Move(0, $win->ScaleHeight - $sb->Height);
 $sb->Resize($win->ScaleWidth, $sb->Height);
}

sub T1_Timer {
 print "Timer went off!\n";
 return 0;
}

#### Child 1
sub Thread1{
 my $ctr = 1;
 while( $ts1_run != -1 ){ # die when semaphore says so.
  if( $ts1_run == 1  && defined($t1_objHandle) ){ #only create a new value when the semaphore is Up
   Win32::GUI::ProgressBar::SetPos($t1_objHandle, $ctr);
   $ctr++;
   $ctr = 0 if $ctr > 99;
  }
  select(undef, undef, undef, 0.01);
 }
}

#### Child 2
sub Thread2{
 my $ctr = 1;
 while( $ts2_run != -1 ){ # die when semaphore says so.
  if( $ts2_run == 1 && defined($t1_objHandle) ){ #only create a new value when the semaphore is Up
   Win32::GUI::ProgressBar::SetPos($t2_objHandle, $ctr);
   $ctr++;
   $ctr = 0 if $ctr > 99;
  }
  select(undef, undef, undef, 0.01);
 }
}

Thanks in advance,
Brian Fredette