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

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 ... ] ); }