Vhaerun Posted March 1, 2008 Report Share Posted March 1, 2008 Am avut nevoie zilele trecute sa explic la cineva cum functioneaza fork si threaduri , pentru a pune ceva sa se execute in fundal , si respectivul nu a inteles Asa ca am facut un modul perl ( nu prea ma ocup cu ele ,de aceea calitatea s-ar putea sa nu fie chiar punctul forte , dar e functionabil ) , care sa ii dea posibilitatea sa execute subrutine in fundal .package ObjectTasking;$SIG{ALRM}=sub { die "timeout";};sub new { my $class=shift; my $func=shift; my $args=shift; my $self={}; $self->{FUNC}=$func; $self->{ARGS}=$args; bless($self,$class); return $self;}sub func { my $self=shift; my @args=@{ shift @_ }; &{ $self->{FUNC} }(@args);}sub multi_task_timer { my $self=shift; my $timer=shift; eval { my $pid=fork(); alarm $timer; if($pid) { $self->func($self->{ARGS}); exit; } else { waitpid($pid,0); alarm 0; } }; if($@=~/timeout/i) { return "exited"; }}sub multi_task { my $self=shift; my $pid=fork(); if($pid) { $self->func($self->{ARGS}); exit; } else { waitpid($pid,0); }}1;pentru cei care au experienta in perl , codul ar trebui sa fie destul de usor de inteles . pentru ceilalti pun un exemplu :use strict;use warnings;use ObjectTasking;my $task=ObjectTasking->new(\&test,["test1"]);my $result=$task->multi_task_timer(2);print "here\n";sleep(1);if($result eq "exited") { print "Functia a fost intrerupta\n";}sub test { my @param=@_; print "@param\n"; sleep(20); print "sfarsitul functiei\n";}E un quick hack pentru cei care nu stiu folosi fork/alarm/threads .Parametrii unui obiect ObjectTasking sunt referinta spre functie si parametrii ei . Pentru o executie completa se utilizeaza metoda multi_task , pentru a executa functia doar un anumit numar de secunde se utilizeaza metoda multi_task_timer , cu numarul de secunde dupa care executia functiei va fi intrerupta .Ar fi util sa punem ceva module scrise de noi , care sa usureze din munca zilnica . Ce ziceti ? Quote Link to comment Share on other sites More sharing options...