in reply to Re^2: Perl/Tk vs Win32::SerialPort
in thread Perl/Tk vs Win32::SerialPort

One more question :) Is there a way to share my $serial object with the serialport thread?

I want to share this:

$serial=(Win32::SerialPort->new($ports[$portname])

So my serial worker thread could read from this. The only need for that is cause i select COMx ports from a listbox and i don't know how to tell the thread to read from the specific port

my $serial :shared = shared_clone({}); bless($serial, 'Serial');

When i share my serial object i get an error at $serial->read(1); line saying "Thread 1 terminated abnormally: Can't call method "read" on an undefined value"

Replies are listed 'Best First'.
Re^4: Perl/Tk vs Win32::SerialPort (stash, dispatch, queue)
by Anonymous Monk on Dec 10, 2013 at 22:40 UTC
    Put it on the queue? As data to create a new serialport object, not the serialport object itself?

    So setup

    sub Main { my $qin = Thread::Queue->new(); my $qout = Thread::Queue->new(); my $guithread = threads->create( \&tkgui, $qin, $qout ); ## don't wait for background downloading service / mechtitles threads->create( \&mechtitles, $qin, $qout ); $guithread->join; ## wait for gui to finish return; } ## end sub Main

    Then from tkgui somewhere (a button), you tell "mechtitles" to create a newserialport with a message

    my $message = { newserialport => [qw/ COM6 baudrate 11 ... /] } ; $qin->push( $message );

    Then back in mechtitles, you have a dispatch table, and you use the message from $qin to invoke a callback to create a new serialport (and replace existing serialport)

    sub mechtitles { my( $qin, $qout ) = @_; threads->detach(); ## can't join me :) my %dispatch = ( newserialport => \&newserialport, pollserialport => \&pollserialport, ); my %stash; ## STATE require Time::HiRes; while( 1 ) { #~ if( defined( my $url = $qin->popnow ) ) { if( defined( my $action = $qin->pop ) ) { my( $callbackname, $callbackargs ) = %$action; if( my $callback = $dispatch{$callbackname} ){ $callback->(\%stash, $qout, @$callbackargs ); } } Time::HiRes::usleep( 33 * 1000 ); ## microseconds versus milis +econds? grrdoh } } ## end sub mechtitles sub newserialport { my( $stash, $qout, @args ) = @_; my $serialport = Win32::SerialPort->new( ... @args ... ); ... ### THERE IS A NEW STASH IN TOWN $stash->{serialport} = $serialport; } ## end sub newserialport sub pollserialport { my( $stash, $qout, @args ) = @_; ... my $data = $stash->{serialport}->read(1); ## %stash!!!! ... $qout->push( { frobnicatetextdisplay => [ ... $data ... ] ); }