in reply to How do I pass a reference to another program via @ARGV ???

Here are a couple of simple scripts to help get you going. The script below just shows a simple thread which can do the stepper control, without blocking the gui. The important point is that the main Tk thread, will not be able to update textvariables automatically from the thread. So you need a timer running, to check the shared vars, and set the textvariables to their values. And as a bonus, here is a link which should show you how to make graphic of the motor position. See Tk compass dial. You could make one with 2 arrows, one for setting the motor, and a second for displaying the feedback position.

Simple thread with feedback:

#!/usr/bin/perl use warnings; use strict; use Tk; use threads; use threads::shared; my $go : shared; my $die : shared; my $step_set : shared; my $feedback : shared; $go = 0; $die = 0; $step_set = 0; $feedback = 0; my $repeater; my $stepper = 0; my $feedback_display = 0; my $thread = threads->new(\&work); my $mw = MainWindow->new( -title => "Stepper Test" ); my $entry = $mw->Entry(-textvariable => \$stepper)->pack(); my $indicator = $mw->Label(-textvariable => \$feedback_display)->pack( +); $mw->Button(-text=>'Start Stepper', -command=> sub { $step_set = $stepper; $go = 1; # timer to read shared vars $repeater = $mw->repeat(10,sub{ $feedback_display = $feedback; if( $feedback_display == $stepper){ $go =0; } }); })->pack(); $mw->Button(-text=>'Exit', -command=> sub { $go = 0; $die = 1; # must return before joining $repeater->cancel; # JOIN ALL THREADS foreach my $thread (threads->list) { $thread->join; + } exit; })->pack(); MainLoop; sub work{ $|++; while(1){ if($die == 1){ return }; if ( $go == 1 ){ for(0..$step_set){ print "$_\n"; $feedback = $_; select(undef,undef,undef,.5); } }else { sleep 1 } } }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Replies are listed 'Best First'.
Re^2: How do I pass a reference to another program via @ARGV ???
by aplonis (Pilgrim) on Dec 17, 2006 at 02:00 UTC

    That is excellent. Thank you! Your concise example is very fine. It's short and sweet and it runs as is on NetBSD (where I'm browsing from). Thanks very much indeed.

    It's late tonight, but I'm copying it to flash memory for adapting to my Win32 program on the laptop tomorrow. Come Monday I'll try it out on the machine in question.

    FYI -- My particular stepper motor application is to dial up a 20-turn needle valve in a test rig cycling pressure (ramp up, hold, ramp down) thousands of times on a jet engine fuel nozzle. Have to do it that way because this is for a contamination test. The fluid in question is JP-8 jet fuel loaded with calibrated dirt (hematite, rust, Arizona road dirt and lint) and no proportinal or servo-valve would last even 10% of the test.

      FINAL REPORT

      It works exactly as advertized! Hurrah! My stepper motor has been running now for about 200 hours via this threads scenario.

      My particular application proved a bit more complicated as the module I'd been using was OO with a number of hashes, one of them quite large. And I find that the threads module gets kind of complicated if you try to OO-ify things. Still, not to worry. Quite easily gotten around, that.

      Most of that OO business was for non-stepper motor related issues: data and solenoid channels of the LabJack device. OO was by no means required for running the stepper channel as a separate consideration.

      So for the stepper motor I pared things back to essentials: just the basic (non-OO) module Device::LabJack. And that part only did I put into a thread with only the absolute minimum of shared scalars.

      Once simplifed in that manner it ran like a champ. The Tk GUI is lively again. Excellent suggestion. Thanks Zentara!