Thread fork() wirft Fehler Free to wrong pool (Windows) (21 answers)
Opened by bianca at 2013-09-26 07:53

thecoder2012
 2013-09-28 13:18
#170778 #170778
User since
2013-02-04
64 Artikel
BenutzerIn
[default_avatar]
2013-09-28T06:07:10 bianca
Hierbei verstehe ich in der Doku nicht, wie/wo man den Code definiert, der ausgeführt werden soll, wenn die definierte Bedingung eingetreten ist.

Beispiel von Perlmonks 306175 oder
Perlmonks 333656
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use strict;
use Win32::ChangeNotify;

our $PATH ||= '.';
our $S = defined $S ? 1 : 0;

my $notify = Win32::ChangeNotify->new( $PATH, $S, 'FILE_NAME' );

my %last; @last{ glob $PATH . '/*' } = ();

while( 1 ) {
print('Nothing changed'), next unless $notify->wait( 10_000 ); # Check every 10 seconds
$notify->reset;
print 'Something changed';
my @files = glob $PATH . '/*';
if( @files < scalar keys %last ) {
delete @last{ @files };
print 'These files where deleted: ';
print for keys %last;
}
elsif( @files > scalar keys %last ) {
my %temp;
@temp{ @files } = ();
delete @temp{ keys %last };
print 'These files where created: ';
print for keys %temp;
}
else {
print "A non-deletion or creation change occured";
}
undef %last;
@last{ @files } = ();
}

Da es lediglich FindFirstChangeNotification nutzt bei Windows. Muss man eben doch von Hand prüfen, was genau sich ändert sonst übersieht man möglicherweise eine Änderung aber es rennt nicht ständig die Schleife durch.

Ansonsten siehe auch
http://www.perlmonks.org/bare/?node_id=366446 bzw. http://www.sthomas.net/roberts-perl-tutorial.htm/c...
Allgemein ist es einfach nur sinnvoller nicht ununterbrochen Leistung zu verschwenden sondern das System die Arbeit machen zu lassen.

Ansich soll es ein besseres Modul names Win32::AdvNotify geben aber dazu fande ich keinen Download bzw. Quelle vom Quellcode mehr. Trotz es das in O'Reilly - Perl - Perl For Sysadmins im Buch erwähnt wird. Hab den letzten Autor mal kontaktiert von http://pages.videotron.com/aminer/ aber dort geht der Download nicht mehr. Immerhin gab es kürzlich dort erst Updates.

2013-09-28T06:07:10 bianca
Wenn ich das richtig verstanden habe bringt mir das nichts. Denn mein Problem liegt nicht in der Verzeichnisüberwachung sondern in der Prozessteuerung.

Ein Modul empfinde ich da als angenehmere Lösung und meist werden mehr Probleme berücksichtigt. Aber ja das Modul ist nur für die Verzeichnisüberwachung.

2013-09-27T07:26:01 thecoder2012
Das schaue ich mir jetzt mal genauer an.

Bei Bedarf bei Sleep eine weitere Zeile einfügen:
Code: (dl )
use Coro::Timer qw(sleep timeout);

Anderenfalls würde Sleep nicht nur eine gewollte Pause in einem Vorgang machen, sondern in allen aktuellen Vorgängen.

View full thread fork() wirft Fehler Free to wrong pool (Windows)