Added an option for enabling/disabling background processing

This commit is contained in:
Alessandro Ranellucci 2014-06-13 15:54:13 +02:00
parent a0674714b1
commit a35ab2f4ee
3 changed files with 40 additions and 11 deletions

View file

@ -63,6 +63,7 @@ our $Settings = {
mode => 'simple',
version_check => 1,
autocenter => 1,
background_processing => 1,
},
};
@ -101,6 +102,7 @@ sub OnInit {
$last_version = $Settings->{_}{version};
$Settings->{_}{mode} ||= 'expert';
$Settings->{_}{autocenter} //= 1;
$Settings->{_}{background_processing} //= 1;
}
$Settings->{_}{version} = $Slic3r::VERSION;
Slic3r::GUI->save_settings;

View file

@ -8,7 +8,9 @@ use List::Util qw(sum first);
use Slic3r::Geometry qw(X Y Z MIN MAX scale unscale);
use threads::shared qw(shared_clone);
use Wx qw(:button :cursor :dialog :filedialog :keycode :icon :font :id :listctrl :misc :panel :sizer :toolbar :window);
use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE);
use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED
EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL
EVT_CHOICE EVT_TIMER);
use base 'Wx::Panel';
use constant TB_ADD => &Wx::NewId;
@ -26,6 +28,7 @@ use constant TB_SCALE => &Wx::NewId;
use constant TB_SPLIT => &Wx::NewId;
use constant TB_VIEW => &Wx::NewId;
use constant TB_SETTINGS => &Wx::NewId;
use constant PROCESS_TIMER_EVENT => &Wx::NewId;
# package variables to avoid passing lexicals to threads
our $THUMBNAIL_DONE_EVENT : shared = Wx::NewEventType;
@ -36,6 +39,7 @@ our $PROCESS_COMPLETED_EVENT : shared = Wx::NewEventType;
use constant CANVAS_SIZE => [335,335];
use constant FILAMENT_CHOOSERS_SPACING => 3;
use constant PROCESS_DELAY => 1 * 1000; # milliseconds
my $PreventListEvents = 0;
@ -49,6 +53,8 @@ sub new {
$self->{model} = Slic3r::Model->new;
$self->{print} = Slic3r::Print->new;
$self->{objects} = [];
$self->{process_timer} = Wx::Timer->new($self, PROCESS_TIMER_EVENT)
if $Slic3r::have_threads;
$self->{print}->set_status_cb(sub {
my ($percent, $message) = @_;
@ -227,6 +233,11 @@ sub new {
$self->on_process_completed($event->GetData);
});
EVT_TIMER($self, PROCESS_TIMER_EVENT, sub {
my ($self, $event) = @_;
$self->start_background_process;
});
$self->{canvas}->update_bed_size;
$self->update;
@ -449,8 +460,7 @@ sub objects_loaded {
$self->{list}->Select($obj_idxs->[-1], 1);
$self->object_list_changed;
# TODO: start timer for new export thread
$self->start_background_process;
$self->schedule_background_process;
}
sub remove {
@ -676,6 +686,18 @@ sub split_object {
$self->load_model_objects(@model_objects);
}
sub schedule_background_process {
my ($self) = @_;
return if !$Slic3r::GUI::Settings->{_}{background_processing};
# kill current thread if any
$self->stop_background_process;
# (re)start timer
$self->{process_timer}->Start(PROCESS_DELAY, 1); # 1 = one shot
}
sub start_background_process {
my ($self) = @_;
@ -731,6 +753,7 @@ sub start_background_process {
sub stop_background_process {
my ($self) = @_;
$self->{process_timer}->Stop;
$self->statusbar->SetCancelCallback(undef);
$self->statusbar->StopBusy;
$self->statusbar->SetStatusText("");
@ -1022,14 +1045,10 @@ sub on_config_change {
return if !$self->skeinpanel->is_loaded;
# TODO: pause export thread
my $invalidated = $self->{print}->apply_config($self->skeinpanel->config);
if ($invalidated) {
# kill export thread
$self->stop_background_process;
# TODO: start timer for new export thread
$self->start_background_process;
}
# schedule a new process thread if new config invalidates any step
$self->schedule_background_process
if $self->{print}->apply_config($self->skeinpanel->config);
}
sub list_item_deselected {

View file

@ -44,6 +44,14 @@ sub new {
tooltip => 'If this is enabled, Slic3r will auto-center objects around the configured print center.',
default => $Slic3r::GUI::Settings->{_}{autocenter},
},
{
opt_key => 'background_processing',
type => 'bool',
label => 'Background processing',
tooltip => 'If this is enabled, Slic3r will pre-process objects as soon as they\'re loaded in order to save time when exporting G-code.',
default => $Slic3r::GUI::Settings->{_}{background_processing},
readonly => !$Slic3r::have_threads,
},
],
on_change => sub { $self->{values}{$_[0]} = $_[1] },
label_width => 100,