From: Brian F. <bfr...@gm...> - 2007-07-31 02:16:51
|
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 |