Refactored parallelization code. #154

degen-loop-screen
Alessandro Ranellucci 2012-04-09 13:53:13 +02:00
parent 68b48fa807
commit 64e669d893
2 changed files with 26 additions and 28 deletions

View File

@ -568,25 +568,24 @@ sub generate_support_material {
return @paths; return @paths;
}; };
my %layer_paths = (); my %layer_paths = ();
if ($Config{useithreads} && $Slic3r::threads > 1 && eval "use threads; use Thread::Queue; 1") { Slic3r::parallelize(
my $q = Thread::Queue->new; items => [ keys %layers ],
$q->enqueue(keys %layers, (map undef, 1..$Slic3r::threads)); thread_cb => sub {
my $q = shift;
my $thread_cb = sub {
my $paths = {}; my $paths = {};
while (defined (my $layer_id = $q->dequeue)) { while (defined (my $layer_id = $q->dequeue)) {
$paths->{$layer_id} = [ $clip_pattern->($layers{$layer_id}) ]; $paths->{$layer_id} = [ $clip_pattern->($layers{$layer_id}) ];
} }
return $paths; return $paths;
}; },
collect_cb => sub {
foreach my $th (map threads->create($thread_cb), 1..$Slic3r::threads) { my $paths = shift;
my $paths = $th->join;
$layer_paths{$_} = $paths->{$_} for keys %$paths; $layer_paths{$_} = $paths->{$_} for keys %$paths;
} },
} else { no_threads_cb => sub {
$layer_paths{$_} = [ $clip_pattern->($layers{$_}) ] for keys %layers; $layer_paths{$_} = [ $clip_pattern->($layers{$_}) ] for keys %layers;
} },
);
foreach my $layer_id (keys %layer_paths) { foreach my $layer_id (keys %layer_paths) {
my $layer = $self->layers->[$layer_id]; my $layer = $self->layers->[$layer_id];

View File

@ -94,30 +94,29 @@ sub go {
{ {
my $fill_maker = Slic3r::Fill->new('print' => $print); my $fill_maker = Slic3r::Fill->new('print' => $print);
if ($Config{useithreads} && $Slic3r::threads > 1 && eval "use threads; use Thread::Queue; 1") { Slic3r::parallelize(
my $q = Thread::Queue->new; items => [ 0..($print->layer_count-1) ],
$q->enqueue(0..($print->layer_count-1), (map undef, 1..$Slic3r::threads)); thread_cb => sub {
my $q = shift;
my $thread_cb = sub {
$Slic3r::Geometry::Clipper::clipper = Math::Clipper->new; $Slic3r::Geometry::Clipper::clipper = Math::Clipper->new;
my $fills = {}; my $fills = {};
while (defined (my $layer_id = $q->dequeue)) { while (defined (my $layer_id = $q->dequeue)) {
$fills->{$layer_id} = [ $fill_maker->make_fill($print->layers->[$layer_id]) ]; $fills->{$layer_id} = [ $fill_maker->make_fill($print->layers->[$layer_id]) ];
} }
return $fills; return $fills;
}; },
collect_cb => sub {
foreach my $th (map threads->create($thread_cb), 1..$Slic3r::threads) { my $fills = shift;
my $fills = $th->join;
foreach my $layer_id (keys %$fills) { foreach my $layer_id (keys %$fills) {
@{$print->layers->[$layer_id]->fills} = @{$fills->{$layer_id}}; @{$print->layers->[$layer_id]->fills} = @{$fills->{$layer_id}};
} }
} },
} else { no_threads_cb => sub {
foreach my $layer (@{$print->layers}) { foreach my $layer (@{$print->layers}) {
@{$layer->fills} = $fill_maker->make_fill($layer); @{$layer->fills} = $fill_maker->make_fill($layer);
} }
} },
);
} }
# generate support material # generate support material