Hi,
in meinem Programm gibt es eine funktion, die mittels "$widget->repeat"
alle x minuten wiederholt abläuft.
Dummerweise braucht die Funktion ~30 secs, bis sie fertig ist. Während dieser Zeit kann ich sonst nichts mehr machen (z.b. im gui knöpfe drücken, etc etc).
Wie kann ich diese Funktion vom Ablauf des restlichen Programms abkoppeln?
Es gibt dafür ja fork(), aber wie genau kann ich dann "$widget->repeat(50000, \&funktion);" forken?
User since
2003-08-04
14371
Artikel
ModeratorIn
Ich würde an Deiner Stelle mit
POE arbeiten...
thx für den link :)
aber würde es auch mit fork gehen? wie würde man das in diesem fall dann schreiben/coden?
und wieso, falls es mit fork geht, sollte man dann zu POE greifen und nicht einfach fork benutzen?
würde das hier gehen?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $mw = new MainWindow();
$mw->repeat(30000, \&func);
MainLoop();
sub func {
my $pid = fork();
if (not defined $pid) {
print "resources not available\n";
}
elsif ($pid == 1) {
}
elsif ($pid == 0) {
}
}
oder würde da dann trotzdem erst gewartet werden, bis die subroutine fertig ist, was ja erst eintritt, wenn auch der calcs-teil abgearbeitet wurde.
User since
2003-08-04
14371
Artikel
ModeratorIn
Ich habe noch nie mit fork und Tk (gleichzeitig) gearbeitet...
User since
2003-11-28
3645
Artikel
ModeratorIn
fork() sollte gehen, zumindest unter Unix, aber du muss aufpassen, dass du keine Tk-Funktionen in der geforkten Funktion aufrufst. Außerdem sollte man explizit mit CORE::exit() beenden (statt einfach nur exit).
User since
2003-08-04
5246
Artikel
ModeratorIn
man kann bei Tk sogar mit threads arbeiten (ist vermutlich experimentell), wenn man die benoetigten Threads startet, bevor das script noch irgendwas von Tk weiss, und - ebenso wie bei fork - aus den threads nicht auf Tk-Kram zugreift, sondern das vom hauptthread erledigen laesst. Bei meinen Tests funktionierte dieser Weg recht gut, ich weiss jedoch nicht, ob ich sowas auch in produktiven Codes verwenden wuerde...