Hei.
Viitsisikö kukaan kirjoittaa minulle mallia? Tahtoisin tietää miten tulisi hoitaa scripti joka etsisi uusia tiedostoja ja aina kun löytyisi uusi tiedosto se lisättäisin odottavien listaan. Odottettavien listalta otettaisin aina uusi tiedostokäsiteltäväksi niin että säikeiden määrä olisi maksimissaan vaikkapa 8.
Entä voinko jotenkin tunnistaa että säie X on valmis ja luoda uuden?
Jos esitin asiani epäselvästi niin kertoo niin voin yrittää selittää paremmin. Lisäksi aiheeseen liittyvät vinkit ovat tervetulleita.
Itaae tekisin varmaan vaan listan, jossa olisi tiedot tiedostoista ja lisäksi tieto siitä, onko ko. tiedosto jo käsittelyssä. Sitten käynnistäisin halutun määrän säikeitä jotka hakisivat aina listalta ensimmäisen tiedoston, jota ei vielä käsitellä. Kun säie saisi tiedoston käsiteltyä, se hakisi seuraavan. Sitten jos listalla ei olisi yhtään käsittelemätöntä, mutta lista ei olisi valmis, niin säie voisi mennä nukkumaan hetkeksi ja tarkistaa uudestaan kotvan kuluttua. Jos taas lista olisi valmis, säie lopettaisi itsensä.
mutta kun sen pitäisi etsiä samalla löytyykö tiedostoja joita ei ole vielä käsitelty. levyltä siis. noh, kysytään yksinkertaisempi kysymys: miten voin lukea säikeen X tilan? eli onko sen suoritus lopetettu vai ei?
Jahas. Löysinkin miten tuo toimii... Tosin kertokaapas jos teen jotain väärin.
#!/usr/bin/perl
use strict;
use Time::HiRes qw( usleep ); # Activate high resolution sleep
use threads; # Activate support of thread support
use threads::shared; # Activate support of shared variables
my $sum : shared = 0; # Shared variable
my ($thr) = threads->new(\&add, 32); # Open function add as thread
my ($thr) = threads->new(\&add, 65); # Open function add as thread
my ($thr) = threads->new(\&add, 34); # Open function add as thread
my ($thr) = threads->new(\&add, 32); # Open function add as thread
my ($thr) = threads->new(\&add, 65); # Open function add as thread
sub add { # Function that add something to shared variable $sum
my($number) = @_;
$sum = $sum + $number;
my $result = $number;
my $status = 0;
return ($status, $result); # Return statuscode and result
}
my $thr;
my @threads = threads->list; # Get list of threads
while (@threads != 0) { # Loop if there is open threads
foreach $thr (@threads) { # Loop all threads
if ($thr->tid && !threads::equal($thr, threads->self) && $thr->is_joinable()) { # If thread is joinable
print "Joining thread(", $thr->tid() , "):\n"; # Print thread id
my ($status, $returndata) = $thr->join(); # Join thread and catch answer
print "$status: $returndata\n\n"; # Print answer
}
}
usleep(100); # Sleep coz we dont wanna use too much cpu time
@threads = threads->list; # Update threads list
}
print "SUM: $sum\n\n"; # Print sumEDIT: tosiaan englannin hienoa kieltä en hirveän hyvin osaa ja tuo tuloksen kertomin oli ihan vaan kokeilu että älkää turhaan aikaanne tuhlatko jos kielioppivirheitä löytyy kommentoista
Aihe on jo aika vanha, joten et voi enää vastata siihen.