Your solution seems to have solved the problem. Thanks.
"Robert Friberg" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> Hi,
>
> Your code isn't running multiple threads. You create
> a thread and then wait for it to finish with join()
> before creating the next one. I altered this while
> trying it out.
>
> Why do you want threads in the first place? They are
> pretty costly and it seems like you could possibly
> have thousands of them. You might have to run this on
> the monster box too :)
>
> I added use strict and use warnings to your code, made
> adjustments to get rid of warnings and it now runs fine.
>
> See altered code below.
>
> Have a look at perlthrtut, the threads manpage and
> the threads::shared manpage.
>
> hth,
> #---------------------------------------------------
> # Robert Friberg perl,java,xml,uml,sql,delphi,
> # Systemutvecklare c/c++,vb,php,linux,apache
> # 0733-839080
> #
> # Ensofus AB linuxservrar,serverhosting,
> # www.ensofus.se internetsystem, Milj� Online
> #---------------------------------------------------
>
> #code starts
>
> # I ALWAYS use these unless writing something very trivial
> use warnings;
> use strict;
>
> use threads;
>
> # All your variables were globals, particularly
> # $localDir inside sub writeStat. All are now my variables instead.
>
> my $currDir = `cd`;
>
> #chomp only chops newlines
> chomp($currDir);
>
> opendir(IP_MAIN_DIR, $currDir);
>
> #remove '.' and '..'
>
> #why do this? Your next grep discards them anyways...
> my @allBatchFolders = grep !/^\.\.?$/, readdir IP_MAIN_DIR;
>
> #moved up, close ASAP
> closedir(IP_MAIN_DIR);
>
> @allBatchFolders = grep /^[a-z][a-z][a-z]$/, @allBatchFolders;
>
> #open stat file for writing
> open(STATFILE, ">$currDir\\stat.txt");
>
> my @aThread;
>
> # Start 1 thread per entry, not necessarily a directory. This is
> # probably not what you wanted. And don't use indexing unless you must
> foreach my $aDir (@allBatchFolders)
> {
> push @aThread, threads->new(\&writeStat, $aDir);
> }
>
> #wait for each thread to finish, discard returndata
> foreach my $t (@aThread)
> {
> $t->join();
> }
>
>
> close(STATFILE);
>
> sub writeStat
> {
> my $localDir = $currDir . "\\" . $_[0];
> return unless -d $localDir;
> local *DIRECTORY;
> opendir(DIRECTORY, $localDir);
> print "Start wile loop: $_[0]\n";
> print STATFILE "Start wile loop: $_[0]\n";
> rewinddir( DIRECTORY );
> while (my $file = readdir(DIRECTORY))
> {
> writeToFile($_[0], $file);
> }
> print STATFILE "End wile loop: $_[0]\n";
> print "End wile loop: $_[0]\n";
> closedir(DIRECTORY);
> }
>
>
> sub writeToFile : locked
> {
>
> print STATFILE "Thread $_[0]: $_[1]\n";
> print "Thread $_[0]: $_[1]\n";
> }
>
>
>
> #code ends
>