Re: How do you share an object(Telnet Sesion) between threads?

[email protected] (Steve Cookson - gmail)
Newsgroups perl.wxperl.users
Message-ID <[email protected]>
Hi James,

I'm not sure what you already know, but any OO-style module should be of 
the form $obj=Foo::Bar->new();
$obj is a pointer that holds the class and the object as the first two 
variables and you should be able to access anything from it.

     use  Net::Telnet  ();
     $obj  =  Net::Telnet->new(Timeout=>  20);

Maybe you could take the while(1) out of the connect() sub routine and then

     return $telnetsession;

As the last line of the routine.

Here is an example of how it can work:

http://www.perlfect.com/articles/telnet.shtml

I also suggest that while(1), is a bit uncompromising, 
while(!$common{connected}) would be more controlled and using a for loop 
to try a limited number of times, even more so.

Good luck,

Regards

Steve.

On 29/09/15 18:35, James Lynes wrote:
> How do you share an object(Telnet Sesion) between threads?
>
> I need the Telnet session below available to 3 threads(connect, 
> disconnect, & scan). $telnetsession is of type Net::Telnet per 
> print(ref($telnetsession)).
>
> This is part of a larger wxPerl script. All of the display and 
> interlocking between the GUI and threads seems to working corectly.
>
> Crossposted to wxperl-users.
>
> Thanks,
> James
>
> <code>
> # Define the Thread shared data area - All threads access this scaler 
> data fine
> my  %common : shared;
>     $common{ip} = "127.0.0.1";        # Localhost
>     $common{port} = "7356";        # Local Port as defined in gqrx
>     $common{telnetsession} = 0;        # Object Pointer ??? Problem ???
>     $common{tnerror} = 0;        # Status
>     $common{connect} = 0;        # Command
>     $common{connected} = 0;        # Status
>     $common{disconnect} = 0;        # Command
>     $common{scanstart} = 0;        # Command
>     $common{scanstarted} = 0;        # Status
>     $common{beginf} = 0;        # Scan - Beginning Frequency
>     $common{endf} = 0;            # Scan - Ending Frequency
>     $common{step} = 0;            # Scan - Frequency Step
>     $common{squelch} = 0;        # Scan - Minimum RSSI(Recieved Signal 
> Strength Indicator)
>     $common{rssi} = 0;            # Scan - Latest RSSI
>     $common{pause} = 0;            # Scan - Time between scans - msec
>     $common{listen} = 0;        # Scan - Time to Listen to a strong 
> signal - msec
>     $common{mode} = 0;            # Scan - Demodulator Type
>     $common{stopthreads} = 0;        # Command
>
>
> # Connect the Telnet Session - #1
> sub Connect {
>     while(1) {
>         if($common{stopthreads}) {print "\nConnect Thread 
> Terminated\n"; return};
>         if($common{connect}) {
>             if(!$common{connected}) {
>                print "Open Telnet Connection to gqrx\n";
>                my $telnetsession = Net::Telnet->new(Timeout => 2, port 
> => $common{port},
>                                         Errmode => sub 
> {$common{tnerror} = 1;});
>                $telnetsession->open($common{ip});
>                $common{telnetsession} = 
> shared_clone($telnetsession);      # Line 92 Errors
>                $common{connected} = 1;
>                $common{connect} = 0;
>             }
>         }
>         threads->yield();
>     }
> }
> </code>
>
> <code>
> Error message:
> Thread 1 terminated abnormally: Unsupported ref type: GLOB at 
> ./threadedgqrxLite.pl line 92 thread 1
> </code>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.