in reply to Re: Passing self to process as reference
in thread Passing self to process as reference

Here's my code -
#!/usr/bin/perl use strict; use warnings; use MyStuff::Server; my $serverPort = '17077'; my %serverDictionary; $serverDictionary{"barry"} = new MyStuff::Server("barry","localhost",1 +7070); sleep(10); # and my package - # Represents a video server package MyStuff::Server; use strict; use warnings; use Thread; sub new { my $class = shift; my $self = { name => shift, }; bless $self, $class; my @paramters = ($self); my $thread = new Thread \&processJobs, \@paramters; return $self; } sub processJobs { my $self = shift; print "Processing Jobs for Server Named: ", $self->{name},"\n"; }
This gives the error -
Pseudo-hashes are deprecated at line 43. Argument "barry" isn't numeric in hash element at line 43.
Line 43 is where I print. Thanks again!

Replies are listed 'Best First'.
Re^3: Passing self to process as reference
by ELISHEVA (Prior) on Mar 18, 2009 at 11:15 UTC

    That helped a lot. The reason you are getting a wierd result is that you need to call my $thread = new Thread \&processJobs, @paramters (omit the \ before @paramters).

    When you pass \@paramters to the Thread constructor processJobs gets \@paramters passed, as is, as the first parameter, not $self. $self is still there, just inside the array, to see this, add a print STDERR ... to your code, like this:

    sub processJobs { my $self = shift; print STDERR "$self is <@$self>\n"; #print $self print "Processing Jobs for Server Named: ", $self->{name},"\n"; }

    Best,beth

      Thanks. The problem is that I wish to pass by reference. for example -
      my @paramters = $self; my $thread = new Thread \&processJobs, @paramters; $self->{name} = "new name"; return $self; } sub processJobs { my $self = shift; while(1) { print "Processing Jobs for Server Name: ", $self->{name},"\n"; } }
      Will never print "new name". How do I pass self by reference? Thanks.

        "New name" never printing has nothing to do with passing by reference ($self is already reference to the object) and everything to do with how threads work. For more information on this topic by a monk with a similar problem, please see Shared variable not changing?.

        Just to reinforce the point that the blessed object reference (what is stored in $self) can be used to reset the name when threading doesn't get in the way, consider this example using a closure:

        { package Foo; sub new { my $sClass = shift; my $self= { name => shift }; return bless($self, $sClass); } sub printName { my $self = shift; print $self->{name} . "\n"; }; } my $oFoo = Foo->new(q{George Alan O'Dowd}); my $crPrintCurrentName = sub { $oFoo->printName(); }; &$crPrintCurrentName(); $oFoo->{name} = 'Boy George'; &$crPrintCurrentName();

        prints

        George Alan O'Dowd Boy George

        Best, beth

        Heres my code now -
        #!/usr/bin/perl use strict; use warnings; use MyStuff::Server; my $serverPort = '17077'; my %serverDictionary; $serverDictionary{"barry"} = new MyStuff::Server("barry","localhost",1 +7070); sleep(10); # and my package - # Represents a video server package MyStuff::Server; use strict; use warnings; use Thread; sub new { my $class = shift; my $self = { name => shift, }; bless $self, $class; my @paramters = $self; my $thread = new Thread \&processJobs, \@paramters; print "SELF: ", $self,"\n"; $self->{name} = "new name"; return $self; } sub processJobs { my $paramters = shift; my $self = @$paramters[0]; print "SELF: ", $self,"\n"; sleep(5); print $self->{name}, "\n"; }
        this outputs -
        SELF: MyStuff::Server=HASH(0x8153c28)
        SELF: MyStuff::Server=HASH(0x8358760)

        and then lots of barry... but never "new name". So, I'm not passing self by reference. How can I do this? Thanks!