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

Okay I was a noob and shared a wrong variable with the serial thread...Now everything works like a charm!! Thank you Anonymous Monk and zentara for helping me!

Replies are listed 'Best First'.
Re^3: Perl/Tk vs Win32::SerialPort
by Shaoboy (Initiate) on Dec 10, 2013 at 20:25 UTC

    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"

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