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 sum
EDIT: 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.