Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Tk GUI and Listen?

by jdtoronto (Prior)
on Oct 27, 2006 at 13:39 UTC ( #580917=note: print w/ replies, xml ) Need Help??


in reply to Tk GUI and Listen?

There is an elegant solution, Win32::ChangeNotify

use Win32; use Win32::ChangeNotify; my $appdir = Win32::GetFolderPath(Win32::CSIDL_APPDATA); my $notify_dir = $appdir . '/Provider/Application/'; my $notify_file = $notify_dir . 'yourfile.txt'; my $notifyObj; if ( $notifyObj = Win32::ChangeNotify->new( $notify_dir, 0, "LAST_WRIT +E" ) ) { print "We have a notifyObj object\n"; $mw->repeat( 2000, \&checkNotify ); } else { print "Application not installed on this machine\n"; } sub checkNotify { my $rv = $notifyObj->wait(0); print "Found a change\n" if $rv == 1; $notifyObj->reset; if ($rv) { # DO what you need to do } }
jdtoronto

updated added code sample


Comment on Re: Tk GUI and Listen?
Download Code
Re^2: Tk GUI and Listen?
by Anonymous Monk on Oct 27, 2006 at 14:14 UTC
    I've looked at this module before, and I seem to run into a similar peformance issue.
      A couple of simple things if you had performance difficulties. After you have the $notifyObj you will notice that I don't actually use the Notify portion of Win32::ChangeNotify. You need to use the Tk timer event to check the file, you will see from the line:
      $mw->repeat( 2000, \&checkNotify );
      That I use the Tk internal timer to call checkNotify, then in that sub I do:
      my $rv = $notifyObj->wait(0);
      So I call the notify object with a timeout of 0 - i.e. I ask it to return immediately with the status. Just to check, I have Benchmark already running in the application the code came from. Here are the timings for three runs through the changeNotofy:
      A3G took: 8.82149e-005 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 C +PU) A3G took: 0.000113964 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CP +U) A3G took: 8.60691e-005 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 C +PU)
      At a maximum of 114us I don't see a performance issue here.

      jdtoronto

        Your solution does work with a minimal performance impact, but unfortunately it only gets triggered when the file is either opened or closed. The file I'm listening to is always open and getting updated once every x seconds depending on what the external app is doing.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://580917]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2014-09-17 00:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (54 votes), past polls