Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: Re: Re: Re: Re: returning from a thread ?

by liz (Monsignor)
on Aug 21, 2003 at 14:24 UTC ( [id://285481]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: Re: returning from a thread ?
in thread returning from a thread ?

This is perl, v5.6.1...

This implies that you cannot using ithreads, but this:

$thread = threads->new(\&LTG::scanChange::monitor());
implies that you are. Officially, ithreads were not supported under 5.6.1, maybe they were available then already under the hood with Win32. Anyway, they're not guaranteed to work and therefore should not be relied upon. Please upgrade to 5.8.0 before trying to do anything with ithreads.

Sorry to be the bringer of bad news in that respect.

Liz

Replies are listed 'Best First'.
just installed 5.8 but...
by Foggy Bottoms (Monk) on Aug 21, 2003 at 15:51 UTC
    Hi Liz, I've just installed Perl 5.8 :
    This is perl, v5.8.0 built for MSWin32-x86-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2002, Larry Wall Binary build 806 provided by ActiveState Corp. http://www.ActiveState. +com Built 00:45:44 Mar 31 2003 Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using `man perl' or `perldoc perl'. If you have access to + the Internet, point your browser at http://www.perl.com/, the Perl Home Pa +ge.

    Unfortunately, my main file doesn't work fine anymore : I get this Dr. Watson error :
    Acces violation (0xc0000006) address : 0x026663ec1

    I'd forgotten how concise these messages were. It also did this on another file and I realized it was due to Win32::GUI which I reinstalled - I also reinstalled Win32::OLE. I wanted to install the package called threads, but there is no such thing - I'm getting quite confused. Have you any idea where the problem might be ?

    --- PROBLEM FIXED ---
Re: Re: Re: Re: Re: Re: returning from a thread ?
by Foggy Bottoms (Monk) on Aug 22, 2003 at 13:46 UTC
    Hi Liz,

    It's me again... and back to square one - I fixed all my Perl 5.8 migration problems and am back on the thread problem. I've just tested it and it still doesn't return.

    What is the exact bit of code that tells the thread not to freeze the parent process ? If it is detach(), then if it comes after having created and started the thread, how can it possibly know ?

    This may be a dumb question, sorry for the inconvenience...
      After starting a thread, execution of the parent process simply continues. An example:
      use threads; use threads::shared; my $run : shared = 1; my $thread = threads->new( sub { while ($run) { print "Hi!\n"; sleep 1; } } ); print "Waiting 5 seconds while the thread runs\n"; sleep 5; print "Shutting down\n"; $run = 0; $thread->join;
      This should display (possibly in a different order:
      Hi!
      Waiting 5 seconds while the thread runs
      Hi!
      Hi!
      Hi!
      Hi!
      Shutting down
      
      If it doesn't, there is a problem with threads in your environment.

      Liz

        Here goes...
        • To start with, the code that creates and calls the thread - this code is in a file called gui-new.pl
          sub B_resetScan_Click # saves text file, stops thread, restarts thread +. { # open file for write - we want to overwrite the previous file with + the new one open(FOLDERLIST, ">".LTG::dialog::CONFIGFILE) or die "Can't create/ +overwrite file: $!\n"; print FOLDERLIST "#FORCE#\n"; # category ID foreach (0..$window->LB_forceFolder->Count()) { # add each element of the force folder after replacing backslash +es by forward slashes my $folder = $window->LB_forceFolder->GetString($_); while ($folder =~ /\\/){ $folder =~ s/\\/\//; } print FOLDERLIST $folder."\n"; } print FOLDERLIST "#BAN#\n"; # category ID foreach (0..$window->LB_banFolder->Count()) { # add each element of the ban folder my $folder = $window->LB_banFolder->GetString($_); while ($folder =~ /\\/){ $folder =~ s/\\/\//; } print FOLDERLIST $folder."\n"; } close (FOLDERLIST); # now stop the current scan thread # to do this, write in a file th_com.thd the value 0 #if (defined $thread) #{ # open (THREADCOM, ">".LTG::dialog::THREADCOM) or die "Can't crea +te/overwrite file: $!\n"; # print (THREADCOM,"0"); # close THREADCOM; # stop thread #} print "create thread\n"; my $run : shared = 1; $thread = threads->new(\&LTG::scanChange::monitor());# \&LTG::scanC +hange::monitor); print "Waiting 5 seconds while the thread runs\n"; sleep 5; print "Shutting down\n"; $run = 0; $thread->join; }

          For the sake of the code, I copied yours in mine and made the adequate changes (ie function name) but I still kept the sleep and the join which I won't need later...
        • And here's the code of the function called via the thread LTG::scanChange::monitor()
          sub monitor { my @wantedF; # folders to be scanned my @bannedF; # banned folders not to be scanned if ( -e LTG::dialog::CONFIGFILE) { open(FOLDERLIST,LTG::dialog::CONFIGFILE) or die "can't open file +"; my $content = <FOLDERLIST>; my $addForce = 0; while ($content) { if ($content ne "\n") { $content =~ s/\n/ /; ($content =~/^\#FORCE\#/)?($addForce = 1):(($content =~/^\# +BAN\#/)?($addForce = 0):($addForce?push(@wantedF,$content):push(@bann +edF,$content))); } $content = <FOLDERLIST>; } close (FOLDERLIST); } #open (THREADCOM, ">".LTG::dialog::THREADCOM) or die "Can't create/ +overwrite file: $!\n"; #print THREADCOM "1"; #close THREADCOM; #my $active = 1; my $run : shared; while ($run) { # if ( -e LTG::dialog::THREADCOM) # { # open(THREADCOM,LTG::dialog::THREADCOM) or die "can't open fi +le THREADCOM"; # $active = <THREADCOM>; # print "active : $active \n"; # close THREADCOM; # } my %changes = LTG::scanChange::startScan(\@wantedF,\@bannedF,INC +_SUBDIRS); foreach my $k (keys %changes) { print "key : $k -> content : $changes{$k}\n"; } # update database here Sumith print "---while---\n"; } }
        I suspect the error comes from the fact that the shared variable should be global to gui-new.pl instead of local to the function creating the thread...
        Please note that the function monitor freezes as long as there's no change on the hard drive... Should there be one, it notifies the user and loops in the while again...

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://285481]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2024-04-23 14:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found