My script uses threads module for creation several threads. Each thread prints
certain letter for several times via some pause. Kind of letter, number of times,
length of pause are different for every thread. These threads should be work in
parallel. Also, I have to synchronize all starts of the threads, that is all 9
children should be start at the same time, almost 'simultaneously' (at least for
eyes) , without visual delays between each other. Still I've too large total
delay between 'a'-letter and 'i'-letter: about 9 secs on Pentium 133. I've tried:
Thread::Barrier - thread execution barrier/
Win32::IPC - Base class for Win32 synchronization objects/
Proc-SyncExec-1.01 (non-downloadable from CPAN with 'ppm install'),
but nothing could affect to the starts synchronization. Also I'd trying to use
locks, semaphores, alarms, cond_wait, cond_signal, cond_broadcast... without a
success. Maybe, Thread::Signal?.. IPC's kill()?..
 This script is CGI, for win32, IE6; it uses buffering $|++, which may sometimes
be a cause of certain visual problems in browser. Anyway, you can run it just in
a shell and look at process of printing. It's most likely, just after start and
HTML-dumping you won't see: abcdefghi (etc in non-regulated order). It will be
something like this: ababcbacd (etc in non-regulated order). As I understand,
such the asynchronous starts do happen due to sequential subN's works out
without waiting of preparing all future threads to run, every time once each
subN being called in the code:
my $thrN = threads->new(\&subN);
 So, how to sync all the threads starts (or just all letters printing's start)?
 

----------------------------------------------------------
                    Source Code:
----------------------------------------------------------
 
#!C:\Perl\bin\perl -w
 
$|++;
 
print "Content-type: text/html\n\n";
 
use warnings;
 
use Time::HiRes;
use threads;
# use threads::shared;
# use Thread::Barrier;
# use Thread::Semaphore;
 
$doc_top = "<html>\n";
$doc_top .= "<head>\n";
$doc_top .= "<script>\n";
$doc_top .= "function set(id,text) {\n";
$doc_top .= " document.getElementById(id).innerText = text\n";
$doc_top .= "}\n";
$doc_top .= "</script>\n\n";
$doc_top .= "</head>\n";
$doc_top .= "<body>\n\n";
$doc_top .= "<table style=\"font: 8pt Verdana, Arial, Helvetica, Sans-serif; line-height:8pt;\" cellSpacing=\"1\" cellPadding=\"2\" width=\"21%\" border=\"1\">\n";
$doc_top .= "\t<tr>\n";
$doc_top .= "\t\t<td>\n";
 
$doc_middle ='';
 
$doc_bottom .= "\t\t</td>\n";
$doc_bottom .= "\t</tr>\n";
$doc_bottom .= "</table>\n\n";
 
for ($j = 0; $j <= 12; $j++) {
  $doc_middle .= "\t\t\t<tr>\n";
  for ($i = 1; $i <= 9; $i++) {
    $doc_middle .= "\t\t\t\t<td width=\"10%\" id='cell$i$j' bgColor=\"#eeeeee\" align=\"center\">&nbsp</td>\n";
  }
  $doc_middle .= "\t\t\t</tr>\n";
}
 
print $doc_top.$doc_middle.$doc_bottom;
print "<font style=\"font: 8pt Verdana, Arial, Helvetica, Sans-serif; line-height:8pt;\">";
 
sub sub1 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 8; $cur_var++) {
    print "<script>set('cell1$cur_var', 'a')</script>\n";
    Time::HiRes::sleep(0.4);
  }
}
sub sub2 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 5; $cur_var++) {
    print "<script>set('cell2$cur_var', 'b')</script>\n";
    Time::HiRes::sleep(0.2);
  }
}
sub sub3 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 11; $cur_var++) {
    print "<script>set('cell3$cur_var', 'c')</script>\n";
    Time::HiRes::sleep(0.3);
  }
}
sub sub4 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 6; $cur_var++) {
    print "<script>set('cell4$cur_var', 'd')</script>\n";
    Time::HiRes::sleep(1.1);
  }
}
sub sub5 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 2; $cur_var++) {
    print "<script>set('cell5$cur_var', 'e')</script>\n";
    Time::HiRes::sleep(0.5);
  }
}
sub sub6 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 9; $cur_var++) {
    print "<script>set('cell6$cur_var', 'f')</script>\n";
    Time::HiRes::sleep(0.6);
  }
}
sub sub7 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 3; $cur_var++) {
    print "<script>set('cell7$cur_var', 'g')</script>\n";
    Time::HiRes::sleep(0.7);
  }
}
sub sub8 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 5; $cur_var++) {
    print "<script>set('cell8$cur_var', 'h')</script>\n";
    Time::HiRes::sleep(0.8);
  }
}
sub sub9 {
  my $cur_var = 0;
  for($cur_var = $cur_var; $cur_var <= 6; $cur_var++) {
    print "<script>set('cell9$cur_var', 'i')</script>\n";
    Time::HiRes::sleep(0.9);
  }
}
 
my $thr1 = threads->new(\&sub1);
my $thr2 = threads->new(\&sub2);
my $thr3 = threads->new(\&sub3);
my $thr4 = threads->new(\&sub4);
my $thr5 = threads->new(\&sub5);
my $thr6 = threads->new(\&sub6);
my $thr7 = threads->new(\&sub7);
my $thr8 = threads->new(\&sub8);
my $thr9 = threads->new(\&sub9);
 
$thr1->join;
$thr2->join;
$thr3->join;
$thr4->join;
$thr5->join;
$thr6->join;
$thr7->join;
$thr8->join;
$thr9->join;
 
----------------------------------------------------------
                    Results:
----------------------------------------------------------
 
a b c d e f g h i
a b c d e f g h i
a b c d e f g h i
a b c d   f g h i
a b c d   f   h i
a b c d   f   h i
a   c d   f     i
a   c     f      
a   c     f      
    c     f      
    c            
    c            
                 
----------------------------------------------------------
 
 Thanx.
_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to