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
Replies are listed 'Best First'.
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 surveying the Monastery: (15)
As of 2015-07-31 15:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (279 votes), past polls